调试JBoss 100%的CPU使用率

Nat*_*teS 5 java debugging jboss web-applications cpu-usage

最初发布在Server Fault上,有人建议在这里提出这个问题.

我们使用JBoss来运行两个WAR.一个是我们的网络应用程序,另一个是我们的Web服务.Web应用程序访问另一台计算机上的数据库并向Web服务发出请求.Web服务向其他计算机发出JMS请求,聚合数据并返回它.

在我们最大的客户端,大约每月一次,JBoss Java进程占用了所有CPU的100%.运行JBoss的机器有8个CPU.我们的网络应用程序在此期间仍可访问,但页面加载大约需要3分钟.重启JBoss会恢复正常.

数据库机器和所有其他机器都很好,只有运行JBoss的机器受到影响.内存使用情况正常.网络利用率是正常的.JBoss日志中没有可疑的错误消息.

我已经建立了一个尽可能接近客户端生产环境的测试环境,并且我已经完成了高达2倍并发用户数的负载测试.我没有得到我的测试环境来复制问题.

我们从哪里去?我们怎样才能缩小问题?

目前我们唯一的计划是等到生产中出现问题,然后进行一些调试以确定原因.到目前为止,人们刚刚在问题发生时重新启动了JBoss,以尽量减少停机时间.下次它发生时,他们会让开发人员看一看.问题是,下次发生时,可以采取哪些措施来确定原因?

我们可以在同一个盒子上设置一个单独的JBoss实例,并与Web服务分开安装Web应用程序.这样,当下一个问题发生时,我们将知道哪个WAR有问题(假设它是我们的代码).尽管如此,这并没有缩小范围.

我应该启用JMX遥控器吗?这种方式下次出现问题时,我可以与VisualVM连接,看看哪些线程正在占用CPU以及他们到底在做什么.但是,在生产环境中启用JMX远程是否存在重大缺陷?

是否有另一种方法可以查看哪些线程正在占用CPU并获得堆栈跟踪以查看它们在做什么?

还有其他想法吗?

谢谢!

ska*_*man 7

有一种快速而又脏的方法可以识别哪些线程占用了JBoss上的CPU时间.使用浏览器访问JMX控制台(通常在http:// localhost:8080/jmx-console,但可能与您不同),查找一个名为的bean ServerInfo,它有一个调用的操作,它listThreadCpuUtilization会转储实际使用的CPU时间.每个活动的线程,以一个漂亮的表格格式.如果有一个行为不端,它通常会像拇指一样突出.

还有listThreadDump将每个线程的堆栈转储到浏览器的操作.

不如分析器好,但更容易获得基本信息.对于生产服务器来说,连接分析器通常是个坏消息,它非常方便.


Ale*_*ing 1

我认为您绝对应该尝试设置一个测试环境并进行一些负载测试,以便重现您的问题。分析肯定有助于查明问题。

一个快速修复方法是下次使用kill -3 杀死jboss,以便获得转储进行分析。我要检查的第二件事是您是否正在使用 -server 标志运行并且您的 gc 设置是否正常。您还可以运行一些 dstat 来查看进程在锁定期间正在做什么。但同样,仅设置一个负载测试环境(通过 EC2 等)来重现这一点可能更安全。