web-dev-qa-db-ja.com

JVMメモリを適切な方法で監視するにはどうすればよいですか?

忙しい時間帯でも、本番環境でオーバーヘッドの少ない方法でJVMメモリモニターを実行する方法を考えています。

2つのTomcatアプリサーバーが運用環境にあり、それらの背後に負荷分散が設定されているとします。 jvmメモリー統計を表示できる場合は、OOMの問題が発生するサーバーへのリクエストの送信を停止するようにロードバランスに指示できます。これは理にかなっていますか? JconsoleまたはVisualVMがより多くのパフォーマンスリソースを消費するのは私の選択ではありません。

9
Vance

JMXが答えになります(JolokiaはJMXインターフェースです)。

あなたも見たいかもしれません- https://stackoverflow.com/questions/242958/best-tools-to-monitor-Tomcat

3
jasonk

他の人は、メモリ使用量を監視する方法に関する提案を提供しています...

2つのTomcatアプリサーバーが運用環境にあり、それらの背後に負荷分散が設定されているとします。 jvmメモリー統計を表示できる場合は、OOMの問題が発生するサーバーへのリクエストの送信を停止するようにロードバランスに指示できます。これは理にかなっていますか?

ちょっと。しかし、それは必ずしも問題を解決するための最良の方法ではありません。

問題の根本に戻ってみましょう... OOME。 Tomcatのコンテキストでは、OOMEは次のいずれかが原因である可能性があります。

  • アプリケーション、またはTomcat自体のメモリリーク
  • 各Tomcatで多すぎるリクエストを並行して処理しようとした、または
  • 処理中に大量のメモリを必要とする個々のリクエスト。

あなたの問題を解決するには、最初にこれらのどれが起こっているかを知る必要があります...解決策はそれぞれで異なります。

1)これがメモリリークかどうかを確認するには、メモリ分析ツールを使用して長期的なメモリ使用パターンを調べる必要があります。これはおそらく鋸歯状のパターンを示します...これは正常です。あなたが探す必要があるのは、時間の経過とともに上昇する「歯」の底のレベルです。これは、何かが収集できないゴミを作成していることを示しています。つまり、メモリリークです。

メモリリークがある場合、最善の解決策は、コードのどの部分が原因であるかを特定し、修正することです。それ以外のもの...ロードバランシングを含む...は応急処置ソリューションであり、将来的に問題を悪化させる可能性があります。

2)メモリリークを解消したら、一度に処理する要求が多すぎることが問題であるかどうかを把握する必要があります。それを行う最善の方法はわかりませんが、これが問題である場合(または問題があると思われる場合)、いくつかの解決策があります。

  • Tomcatサーバー構成を調整して、ワーカースレッドの数を減らします。

  • リクエストがI/Oバウンドの場合、別の可能性は、サーブレット仕様の最新バージョンで利用可能な非同期リクエスト処理サポートを調べることです-参照 http://docs.Oracle.com/javaee/7/ tutorial/doc/servlets012.htm 。しかし、それはより多くの仕事になります。

3)特定のリクエストがメモリを使いすぎていることが問題であることが判明した場合は、それらのリクエストを事前に検出して「対処する」方法を理解する必要があります。これらのリクエストの検出と処理はどちらも難しい場合があります。アプリケーションの詳細なしにアドバイスすることは困難です。しかし、いくつかの実用的なソリューションは次のとおりです。

  • 異常な要求を大きなヒープを持つ別のサーバーに転送します。OOMEは「通常の」要求を妨害しません。

  • ヒープサイズを増やします。十分な物理メモリがある場合、より大きなヒープで実行すると、実際にTomcatサーバーがより効率的になり、OOMEが回避されます。


要約すると、OOMEを回避するために負荷分散を試みるのではなく、なぜOOMEを取得しているかを把握し、原因に対処することをお勧めしますOOMEの直接。

1
Stephen C

たぶん jvmtop は一見の価値があります。

メモリ使用量、CPU使用率、スレッド数などのメトリックを監視する「トップライク」な方法でJVMごとに表示します。

0
MRalwasser