web-dev-qa-db-ja.com

Tomcatが突然死ぬ

64ビットLinux(CentOS)マシンで奇妙なTomcat(_7.0.21_)やJVMエラーを診断しようとしています。

サーバーアプリケーションの負荷テストを行っており、100Kメッセージでヒットしてみました。 jvisualvmを起動し、ヒープをずっと監視していました。約93Kの処理済みメッセージに到達し、Tomcatが停止するまで、すべてが素晴らしく見えました*(以下を参照)。 TomcatのPID番号でpsを実行して、死んでいることを確認しました。

このクラッシュまで:

  • 負荷テストは約90分間実行されていました。 93K/100Kだったので、その後まもなく終了するはずです)
  • CPUは約45%強力でした
  • 使用されたヒープは約2GB(GC後はプラスマイナスの束)でしたが、ヒープサイズは約30分後に4GBから_MAX_HEAP_に増加しました
  • クラスのロード/アンロードは正常に循環していました
  • スレッドダンプは正常でした

サーバーコードのどこにもSystem.exit()の呼び出しはありません-そのため、それをすぐに除外することができます(そして、はい、私は再確認しました!!!)。

これがTomcatのクラッシュなのかJVMなのかわかりません(どうすればわかりますか?)。そして、私が知っていたとしても、何が悪かったのかを示すものを見つけることができないようです。

  • サーバーアプリのすべてのログは、エラーメッセージなしで停止します(ログは普遍的にDEBUG以上に設定されていますが)
  • Tomcatの_catalina.out_と尊重_localhost_access_*_ファイルは情報なしで停止します

Tomcatがコアダンプをログに記録することは可能であると聞きましたが、その方法がわからず、オンラインの例はあまり役に立ちません。

SOこれを診断するにはどうすればよいですか?考えられるすべての要因を除外し始めるには、どのような手順を実行する必要がありますか?

前もって感謝します!

18
IAmYourFaja

申し訳ありませんが、@ ericksonから緑色のチェックを削除する必要がありました。私はついにTomcatを殺しているものを理解しました。

プロファイラープラグインがVisualVMで正しく構成されておらず、Tomcatプロセスでプロファイルを実行しようとするとそれが強制終了されたようです。

理由を今すぐ調査し、詳細がわかり次第、この回答を更新します。

0
IAmYourFaja

JVMがクラッシュした場合は、hs_err_pidNNN.logファイルが必要です。これを有効にするために何もする必要はありません。その場所は、OSとTomcatの実行方法によって異なります。 Windowsでは、サービスとして実行していない限り、デスクトップに表示される可能性があります。それ以外の場合は、クラッシュしたプロセスの現在の作業ディレクトリにあるはずです。

ご使用のオペレーティングシステムは、おそらくプロセス監視用の追加ツールを提供します。環境について詳しく説明するか、 serverfault.com で質問することができます。

jvisualvmが実際にクラッシュを引き起こしている可能性もあります。

問題を再現し、シナリオを徐々に単純化して原因を特定できるようにします。

15
erickson

もう1つの可能性は、OSのメモリが不足していて、 OOM Killer がプロセスを強制終了していることです。この場合、JVMはヒープダンプまたはhs_err_pidファイルを書き込む機会を取得しません。

6
dty

オプションJava -XX:+ HeapDumpOnOutOfMemoryErrorを使用して、メモリ不足エラーによるjvmクラッシュのヒープダンプを作成できます。

詳細はこちら JBossのヒープダンプにHeapDumpOnOutOfMemoryErrorパラメーターを使用

4
Scorpion