一台tomcat服务器,应对峰值200人的压力,为何会卡。

发布于 2021-12-04 00:44:46 字数 777 浏览 954 评论 17

 

公司有多台服务器,为ERP服务的有一台数据库服务器,一台应用服务器。

这台应用服务器是IBM的,具体型号忘了,性能还不错

CPU:Intel Xeon E5-4603 v2*2

内存:64G

操作系统:CENTOS 6.5

应用服务器是2014年年底另一个同事部署的,只有一个tomcat,在公司内外不到200人的访问下,居然频繁挂掉,使用TOP命令看,java CPU占用率经常卡在99.9%。kill掉重新启动tomcat就好了,但是每隔半个月甚至几天就得重启一次。
我复制一个tomcat出来,在这台服务器上运行两个tomcat,除了端口号一模一样,区分不同的部门使用,发现其中一个tomcat工作时间很长(TIME+的值较高),这次运行了一个月多一点,又开始出现卡顿。
我觉得应该从应用下手,tomcat是ERP厂家提供的,他们其他的客户没有爆出这样的问题,远程沟通效果不佳,我是负责实施的,没有这方面的技术,经过几次沟通他们建议采用搭建负载均衡服务器来解决,也提供了一个之前搭建负载均衡的文档过来。但是我觉得应用的问题不解决,即使搭建再多的服务器也没用。
问问大家,这样配置的服务器,承载不了200人的压力么?还是因为长时间有些资源没有释放导致的(刚重启的前几天速度很快),如果我要研究一下应该从哪个方向入手呢?
谢谢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(17

终遇你 2021-12-06 12:21:51

你看下数据库那台机器怎么样,如果数据库那台机器正常的话,那就是你的应用代码写的有问题,看下是不是什么线程在搞事情,jstack pid号。

緦唸λ蓇 2021-12-06 12:21:50

hashmap死循环?

把昨日还给我 2021-12-06 12:21:49

如果不想花太多时间查问题,在不影响使用的前提下,跑一个crontab定时任务,每天晚上自动重启一次吧。

命硬 2021-12-06 12:21:49

我倒是做了一个重启的脚本,就是怕这玩意哪天突然启不了怎么办…担心稳定性

背叛残局 2021-12-06 12:21:47

应该不是死循环,同样的操作重启后就没问题。

睫毛上残留的泪 2021-12-06 12:21:47

top -Hp pid

jstack pid

月亮是我掰弯的 2021-12-06 12:21:46

呵呵了,死循环可以99%  空跑看看

恋你朝朝暮暮 2021-12-06 12:21:44

外包都是草草了事,负责的外包企业少之又少

复古式 2021-12-06 12:21:42

登录的人再多的不会卡,就是部分操作比如选择商品后有大量的js代码做检验,这个工具能跟踪出来么?

海之角 2021-12-06 12:21:42

查一下应用代码吧

背叛残局 2021-12-06 12:21:40

回复
外包的业务每人关心性能的,之前遇到过,主要是调数据库的问题

彼岸花ソ最美的依靠 2021-12-06 12:21:39

回复
你是说 JS 卡吗? 那你都知道原因了,直接 review JS 代码啊

躲猫猫 2021-12-06 12:21:28

找个晚上,自己压压看~~可以用 JMeter gattling,慢慢增加人数,同时观察 CPU

不再见 2021-12-06 12:20:02

我的截图里,top里面还有一个P列,这个可以在top里按f进去设置把它调出来,表示的是程序最后使用的CPU核心编号(Last Used Cpu),我的处理器核心只有4个,所以P的取值只能是:0, 1, 2, 3

执手闯天涯 2021-12-06 12:07:44

你这是地图炮了

风柔一江水 2021-12-06 08:03:56

还有top里的TIME+列也很有意义,表示该任务(进程或线程)启动后使用的总的 CPU 时间.比如1:23.45代表1分钟23.45秒.

情场扛把子 2021-12-05 04:47:44

Java开发者的安全性有待提高呀,居然用root超级用户跑Tomcat服务进程.可以用start-stop-daemon指定用户运行守护进程.

话说Java服务器都这么吃内存的么?居然占用了18个GB.

还有,我查了,E5-4603 v2是一个4核心的CPU,你的服务器有2个CPU,那总的核心数就是8个.这时,top命令在Tasks进程模式下(你的截图就是这个模式),一个任务(进程)利用全部CPU资源时,%CPU应该显示为800%.很多人用惯了Windows,想当然的认为任务的CPU使用率最大值是100%.在Linux上,一个包含多线程的任务进程,CPU使用率超过100%就表示使用超过1个核心,比如我在Ubuntu桌面上使用的Firefox浏览器,其就是一个典型的多线程应用.

我的笔记本处理器是双核4线程的i5-3230M,CPU满载时最大显示400%.

如果你把top命令从Tasks任务进程模式切换到Threads线程模式,则任一线程的%CPU都不能超过100%,比如:
top -H -p `pidof firefox` (参数-H表示使用Threads线程模式观测) 可见:

所以你可以在这个Threads线程模式下看看到底是那个Java线程占用了1个CPU核心,对于C程序(如Nginx/PHP-FPM)一般都是用sudo strace -p PID来跟踪系统调用来发掘问题,对Java程序,也可以用strace看看,不过Java不是还有像jstat这种专门的东西么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文