14

大規模で複雑なTomcatJavaWebアプリケーションでパフォーマンスの問題を解決しようとしています。現時点での最大の問題は、メモリ使用量が急増し、アプリケーションが応答しなくなることです。ログプロファイラーとログファイルのベイズ分析で修正できるものはすべて修正しました。本番のTomcatサーバーでプロファイラーを実行することを検討しています。

優しい感性を持つ読者へのメモ:

本番アプリのプロファイリングという概念自体が不快だと感じる人もいることを理解しています。私は他のほとんどのオプションを使い果たしましたのでご安心ください。これを検討している理由は、テストサーバーで本番セットアップを完全に複製するためのリソースがなく、テストサーバーで対象の障害を発生させることができなかったためです。

質問:

私は、Tomcatで実行されているJava Webアプリケーションで機能するか、言語に依存しない方法でこの質問に答える答えを探しています。

  • プロファイリングのパフォーマンスコストはいくらですか?
  • 本番環境でWebアプリケーションをリモート接続してプロファイリングすることが悪い考えである他の理由(奇妙な障害モード、セキュリティの問題など)はありますか?
  • プロファイリングはメモリーフットプリントにどの程度影響しますか?
  • 具体的には、パフォーマンスコストが非常に低いJavaプロファイリングツールはありますか?
  • Webアプリケーションのプロファイリング用に設計されたJavaプロファイリングツールはありますか?
  • visualVMを使用したプロファイリングのパフォーマンスコストに関するベンチマークを持っている人はいますか?
  • visualVMはどのサイズのアプリケーションとデータセットに拡張できますか?
4

5 に答える 5

13

OProfileとその祖先であるDPCIは、本番システムのプロファイリング用に開発されました。これらのオーバーヘッドは非常に低く、カーネルを含むシステム全体のプロファイルを作成するため、VMカーネルお​​よびライブラリでパフォーマンスの問題を見つけることができます。

あなたの質問に答えるには:

  1. オーバーヘッド:これらはサンプリングされたプロファイラーです。つまり、一定の間隔でタイマーまたはパフォーマンスカウンターの割り込みを生成し、現在実行されているコードを確認します。彼らはあなたがあなたの時間を過ごす場所のヒストグラムを構築するためにそれを使用します、そしてオーバーヘッドは合理的なサンプリング間隔のために非常に低いです(1-8%は彼らが主張するものです)。

    OProfileのサンプリング頻度とオーバーヘッドのこのグラフを見てください。デフォルトが好みに合わない場合は、オーバーヘッドを低くするためにサンプリング周波数を調整できます。

  2. 本番環境での使用: OProfileを使用する際の唯一の注意点は、本番マシンにOProfileをインストールする必要があることです。RHEL3以降、RedHatにはカーネルサポートがあると思います。他のディストリビューションでもサポートされていると確信しています。

  3. メモリ: OProfileの正確なメモリフットプリントが何であるかはわかりませんが、比較的小さなバッファを保持し、ログファイルにダンプすることがあると思います。

  4. Java: OProfileには、Javaをサポートし、JITで実行されているコードを認識するプロファイリングエージェントが含まれています。したがって、インタプリタとJITでのC呼び出しだけでなく、Java呼び出しも表示できます。

  5. Webアプリ: OProfileはシステムレベルのプロファイラーであるため、Webアプリが持つセッションやトランザクションなどを認識しません。

    とはいえ、これはフルシステムプロファイラーであるため、パフォーマンスの問題がOSとJITの間の不適切な相互作用によって引き起こされている場合、またはサードパーティライブラリにある場合は、OProfileプロファイルが原因でそれを確認できます。カーネルとライブラリ。これは、テスト環境に存在しない可能性のある本番環境の構成の誤りや詳細に起因する問題を検出できるため、本番システムにとっての利点です。

  6. VisualVM:VisualVMの経験がないので、これについてはよくわかりません

これは、OProfileを使用してパフォーマンスのボトルネックを見つけるためのチュートリアルです。

于 2009-07-30T16:59:43.243 に答える
3

私はYourKitを使用して、高負荷の本番環境でアプリのプロファイルを作成しました。確かに影響はありましたが、簡単に受け入れられるものでした。Yourkitは、より高価な特定のプロファイリング機能を選択的にオフにするなど、非侵襲的な方法でこれを実行できることを大いに活用しています(実際にはスライディングスケールです)。

私のお気に入りの点は、YourKitエージェントを実行した状態でVMを実行でき、パフォーマンスへの影響がゼロであることです。GUIを接続してプロファイリングを開始した場合にのみ、効果があります。

于 2009-07-30T16:47:06.203 に答える
1

本番アプリのプロファイリングに問題はありません。分散アプリケーションで作業している場合、非常にユニークな確率シナリオでメモリ不足例外が発生することがあります。これは、dev / stage/uat環境で再現するのが非常に困難です。

カスタムプロファイラーを使用してみることができますが、急いでいて、本番ボックスにプロファイラーをプラグイン/セットアップするのに時間がかかる場合は、jvmを使用してメモリダンプを取得することもできます(jvmsメモリダンプはスレッドダンプも提供します)

  1. 次のオプションを使用して、JVMコマンドラインで自動生成をアクティブ化できます。-XX:+ HeapDumpOnOutOfMemoryError

  2. Eclipse Memory Analyzerプロジェクトには、「group by value」と呼ばれる非常に強力な機能があります。これにより、オブジェクトクエリを作成し、フィールド値でインスタンスを再グループ化できます。これは、可能な値のより小さなセットを含むインスタンスが多数あり、どの値が最も使用されているかを確認できる場合に役立ちます。これは、いくつかの複雑なメモリダンプを理解するのに本当に役立ちましたので、試してみることをお勧めします。

于 2014-04-27T00:55:51.147 に答える
1

最新のHotSpotJVMの1つであるJavaFlightRecorderとJavaMissionControlの使用を検討することもできます。これは、CPUオーバーヘッドが約5%の低レベルのランタイム情報を収集できるツールのセットです(最後のステートメントはとにかく証明できません。これは、機能とライブデモを提示したOracleエンジニアのステートメントです)。

1_7u40アプリケーションがJVM以降を実行している限り、このツールを使用できます。ランタイム情報収集を有効にするには、特定のフラグを使用してJVMを起動する必要があります。

デフォルトでは、JVMではJFRが無効になっています。JFRを有効にするには、-XX:+FlightRecorderオプションを指定してJavaアプリケーションを起動する必要があります。JFRは商用機能であり、Java Platform、Standard Edition(Oracle JavaSEAdvancedおよびOracleJavaSE Suite)に基づく商用パッケージでのみ使用できるため、-XX:+UnlockCommercialFeaturesオプションを使用して商用機能を有効にする必要もあります。

(引用http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7

これは本番IMOでプロファイリングするための実行可能なオプションであるため、この回答を追加しました。

また、JFRとJMCをサポートし、ユーザーフレンドリーな情報を表示できるEclipseプラグインがあります。

于 2014-04-30T00:19:34.590 に答える
0

ツールは何年にもわたって大幅に改善されました。最近、このようなニーズを持つほとんどの人は、プロファイリングAPIの代わりにJavaのインストルメンテーションAPIにフックするツールを使用しています。確かにもっと多くの例がありますが、NewRelicAppDynamics思い浮かぶ。インストルメンテーションベースのソリューションは通常、JVMでエージェントとして実行され、常にデータを収集します。これらは、古いプロファイリングアプローチよりも高いレベル(ビジネストランザクション、Webトランザクション、データベーストランザクション)でデータをレポートし、必要に応じてより深く(メソッドまたはラインまで)掘り下げることができます。監視とアラートを設定することもできるため、ページの読み込み時間やSLAに対するパフォーマンスなどのメトリックを追跡/アラートすることができます。これらの優れたツールを使用すれば、プロファイラーを本番環境で実行する理由はもうありません。それらを実行するコストはごくわずかです。

于 2014-05-03T00:37:32.043 に答える