
私のアプリケーションはJBOSS EAP 6.1にインストールされています。数日前、私たちはアプリケーションが遅いか、エンドユーザーがアクセスできないことを発見しました。
我々は記録し、ps -aux
出力の1つは次のとおりです。
[Mon Jun 12 08:55:29.218 2017] 500 46257 90.7 10.2 22713508 6779044 ? Sl Apr26 61791:48 /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.45.x86_64/jre/bin/java -D[Standalone] -server -XX:+UseCompressedOops -Xms2048m -Xmx4096m -XX:MaxPermSize=512m -Djava
このJavaプロセスが私のCPUを占めているようです。そしてそれはSlモードにあります。これが私の家です。
これがアプリケーションの問題の原因かもしれませんか?
CPU使用率が高いのはなぜですか?
JBOSSアプリケーションサーバーでこのプロセスの役割は何ですか?
スレッドダンプとGcログを取得できず(後でgcログが有効になっていないことを確認しました)、サーバーを再起動しました。今はログがありません。
答え1
表示される出力には、サーバーとして実行されるjavavm以外のアプリケーションは表示されません。
使用されるメモリが制限に近づくと、Javaアプリケーションで高いCPU負荷が頻繁に発生します。ガベージコレクションは、メモリを再利用するために実行され続けます。これによりアプリケーションのパフォーマンスが低下し、ほぼすべてのCPUサイクルが消費されます。
プロセスを終了したため、プロセスを把握する機会がなくなりました。
将来の私の提案は、JVMを監視する方法を設定することです。
- GCLogを追加するのは簡単な方法です。
- JMXリモートモニタリングの追加(認証を追加してください)以下を参照してください。 http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html
- サードパーティのプロキシがJava仮想マシンに直接接続できるようにします。
この状況が再び発生した場合は、次のことができます。
Java インスタンスの Java スタックトレースを取得します。 (
PID 46257で実行されるJava)
jstack -l 46257 >jstack-output.log
次に、さらなる分析のためにヒープダンプを実行します。
jmap -dump:live,format=b,file=jmap-heapdump.hprof 46257
hprof-heapdump分析は、さまざまなツール(google:java heapdump detector)を介して実行できます。これは、高いCPU負荷の原因をよりよく見つけるのに役立ちます。