3

JBoss AS 4.2.3 と seam フレームワークを使用しています。ユーザー数が増えると CPU 使用率が上がり、わずか 80 人のユーザーで 99% に達します。また、Hibernate、EJB3、および Apache を mod_jk と共に使用して負荷分散を行います。

スレッド ダンプを取得すると、すべての実行可能なスレッドが次のトレースで同じアクティビティを実行しています。

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 使用率が同じままであることがわかりました。

4

2 に答える 2

1

これらのスレッドは、ソケット接続から読み取ろうとしています。この場合、次のリクエストがmod_jkApache からサーバーに送信されるのを待っています。これはごく普通のことであり、おそらく CPU 使用率の原因ではありません。

この時点で、プロファイラーを介してアプリケーションを実行する必要があります。

システムでプロファイラーを実行できない場合 (つまり、実稼働マシンの場合)、次善の策は、数秒間隔で多数のスタック ダンプを取得し、スレッド ID を手動で照合することです。コードを実行していて、ダンプ間で変更されていないように見えるスレッドを探す必要があります。

これは非常に退屈な作業であり、常に明確な結果が得られるわけではありませんが、プロファイラーや何らかの計測器がなければ、CPU がどこに向かっているのかを見つけることはできません。

于 2011-06-13T13:00:57.417 に答える