最初发布on Server Fault,在那里有人建议这个问题可能会在这里更好地问。调试JBoss 100%CPU使用率
我们使用JBoss来运行我们的两个WAR。一个是我们的网络应用程序,另一个是我们的网络服务。 Web应用程序访问另一台计算机上的数据库并向Web服务发出请求。 Web服务向其他机器发出JMS请求,汇总数据并将其返回。
在我们最大的客户端,大约每月一次的JBoss Java进程占所有CPU的100%。运行JBoss的机器有8个CPU。我们的网络应用程序在这段时间内仍然可以访问,但页面大约需要3分钟才能加载。重新启动JBoss将一切恢复正常。
数据库机器和所有其他机器都很好,只有运行JBoss的机器受到影响。内存使用情况正常。网络利用率是正常的。 JBoss日志中没有可疑的错误消息。
我已经建立了一个尽可能接近客户端生产环境的测试环境,并且我已经完成了负载测试,其并发用户数量是2倍。我还没有得到我的测试环境来重现问题。
我们从哪里出发?我们如何缩小问题的范围?
目前我们唯一的计划是等到问题发生在自己的生产中,然后进行一些调试以确定原因。到目前为止,人们在发生问题时刚刚重新启动了JBoss以最大限度地缩短停机时间。下次发生时,他们会让开发人员看一看。问题是,下次发生时,可以做什么来确定原因?
我们可以在同一个盒子上设置一个单独的JBoss实例,并从Web服务中单独安装Web应用程序。这样,当下一个问题发生时,我们将知道哪个WAR有问题(假设它是我们的代码)。尽管如此,这并没有缩小范围。
我应该启用JMX remote吗?通过这种方式,下次发生问题时,我可以使用VisualVM进行连接,查看哪些线程在使用CPU,以及他们在做什么。但是,在生产环境中启用JMX远程控制是否有重大缺陷?
是否有另一种方法来查看哪些线程正在吃CPU,并得到一个堆栈跟踪,看看他们在做什么?
还有其他想法吗?
谢谢!
你好。 您是否发现了JBoss问题的根源? 我们不时有同样的问题。 – 2010-05-19 15:47:13
是的,对于延迟抱歉。我们有一个HashMap被两个线程同时写入。如果一个放置触发重新散布,则第二个放置可以导致两个映射节点相互指向。接下来的HashMap会触发一个无限循环。 – NateS 2010-06-06 08:09:03