我正在将JBoss AS 4.2.3与接缝框架一起使用。我的CPU使用率随着用户数量的增加而增加,仅80位用户就达到了99%。我们还使用带有mod_jk的Hibernate,EJB3和Apache进行负载平衡。
当我进行线程转储时,所有可运行的线程都通过以下跟踪进行相同的 Activity :
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:1012)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:1091)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:384)
at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:366)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
at java.lang.Thread.run(Thread.java:662)
我无法用堆栈跟踪解释它。我还发现,即使用户已注销,线程处于相同状态的CPU使用率仍然保持不变。
最佳答案
这些线程正在尝试从套接字连接读取。在这种情况下,他们正在等待下一个请求从Apache中的mod_jk
发送到服务器。这是很正常的,它们可能不是CPU使用率的原因。
此时,您确实需要通过分析器运行应用程序。
如果您无法在系统上运行探查器(即它是生产箱),那么最好的办法是开始每隔几秒钟就开始进行许多堆栈转储,然后手动将它们与线程ID相匹配。您需要查找正在运行代码的线程,并且转储之间似乎没有变化。
这是一项非常繁琐的任务,并且无法始终获得清晰的结果,但是如果没有分析器或某种检测手段,您将无法找到所有CPU的运行方向。
关于performance - JBoss CPU利用率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6330565/