本番環境でのWebアプリケーションのプロファイリングのパフォーマンスコスト
-
05-07-2019 - |
質問
大規模で複雑なTomcat Java Webアプリケーションのパフォーマンスの問題を解決しようとしています。現時点での最大の問題は、時々メモリ使用量が急増し、アプリケーションが応答しなくなることです。ログプロファイラーとログファイルのベイジアン分析で修正できるすべてを修正しました。実稼働Tomcatサーバーでプロファイラーを実行することを検討しています。
穏やかな感度を持つ読者への注意:
プロダクションアプリをプロファイリングするという概念が非常に不快であると感じる人もいることを理解しています。私が他のオプションのほとんどを使い果たしたことを安心してください。これを検討している理由は、テストサーバーで実稼働セットアップを完全に複製するためのリソースがなく、テストサーバーで問題の障害を引き起こすことができないためです。
質問:
Tomcatで実行されているJava Webアプリケーションで機能する回答、または言語に依存しない方法でこの質問に回答する回答を探しています。
- プロファイリングのパフォーマンスコストはいくらですか?
- リモートで本番環境のWebアプリケーションに接続してプロファイルを作成するのが適切でない理由(奇妙な障害モード、セキュリティの問題など)
- プロファイリングはメモリフットプリントにどの程度影響しますか?
- 具体的には、パフォーマンスコストが非常に低いJavaプロファイリングツールはありますか?
- Webアプリケーションのプロファイリング用に設計されたJavaプロファイリングツールはありますか
- visualVMを使用したプロファイリングのパフォーマンスコストに関するベンチマークはありますか?
- visualVMがスケーリングできるアプリケーションとデータセットのサイズは?
解決
OProfile とその祖先 DPCI は、プロダクションシステムのプロファイリング用に開発されました。これらのオーバーヘッドは非常に低く、カーネルを含むフルシステムのプロファイルを作成するため、VMと のカーネルとライブラリでパフォーマンスの問題を見つけることができます。
質問に答えるには
-
オーバーヘッド:これらはサンプリングプロファイラーです。つまり、タイマーまたはパフォーマンスカウンターは一定の間隔で割り込み、現在実行されているコードを調べます。彼らはあなたが時間を費やした場所のヒストグラムを作成するためにそれを使用し、オーバーヘッドは非常に低いです(1-8%は妥当なサンプリング間隔について)主張します。
サンプリング頻度とOProfileのオーバーヘッドのこのグラフをご覧ください。デフォルトが好みに合わない場合は、オーバーヘッドを低くするためにサンプリング頻度を調整できます。
-
実稼働環境での使用: OProfileを使用する場合の唯一の注意点は、実稼働マシンにインストールする必要があることです。 Red HatにはRHEL3以降のカーネルサポートがあると信じており、他のディストリビューションもそれをサポートしていると確信しています。
-
メモリ: OProfileの正確なメモリフットプリントはわかりませんが、比較的小さなバッファを保持し、時々ログファイルにダンプしていると思います。
-
Java: OProfileには、Javaをサポートし、JITで実行されるコードを認識するプロファイリングエージェントが含まれています。したがって、インタープリターとJITのC呼び出しだけでなく、Java呼び出しを表示できます。
-
Webアプリ: OProfileはシステムレベルのプロファイラーであるため、Webアプリが持つセッションやトランザクションなどを認識しません。
とはいえ、それはフルシステムプロファイラーなので、パフォーマンスの問題がOSとJITの間の不適切な相互作用によって引き起こされる場合、またはサードパーティライブラリにある場合は、 OProfileはカーネルとライブラリのプロファイルを作成するため、これを確認できます。これは、テスト環境に存在しない可能性のある本番環境の誤設定または詳細に起因する問題をキャッチできるため、本番システムの利点です。
-
VisualVM: VisualVMの経験がないため、これについてはわかりません
OProfileを使用してパフォーマンスのボトルネックを見つけるためのチュートリアル 。
他のヒント
YourKitを使用して高負荷の実稼働環境でアプリのプロファイルを作成しましたが、確かに影響はありましたが、簡単に受け入れられるものでした。 Yourkitは、非-より高価な特定のプロファイリング機能を選択的にオフにするなどの侵襲的な方法(実際にはスライディングスケールです)。
私が気に入っている点は、YourKitエージェントを実行したままVMを実行できることです。パフォーマンスへの影響はありません。 GUIを接続してプロファイリングを開始して初めて効果が現れます。
プロダクションアプリのプロファイリングに問題はありません。分散アプリケーションで作業している場合、開発/ステージ/ uat環境で再現するのが非常に難しい非常にユニークな確率シナリオでメモリ不足例外が発生することがあります。
カスタムプロファイラーの使用を試すことができますが、急いでプロダクションボックスへのプロファイラーのプラグイン/セットアップに時間がかかる場合は、jvmを使用してメモリダンプを取得することもできますダンプ)
-
次のオプションを使用して、JVMコマンドラインで自動生成をアクティブにできます。 -XX:+ HeapDumpOnOutOfMemoryError
-
Eclipse Memory Analyzerプロジェクトには、値によるグループ化”と呼ばれる非常に強力な機能があります。これにより、オブジェクトクエリを作成し、フィールド値でインスタンスを再グループ化できます。これは、使用可能な値のセットが少ないインスタンスが多数あり、どの値が最も使用されているかを確認できる場合に役立ちます。これにより、いくつかの複雑なメモリダンプを理解することができたので、試してみることをお勧めします。
最新のHotSpot JVMの1つであるJava Flight Recorderと Java Mission Control 。これは、CPUオーバーヘッドが約5%の低レベルのランタイム情報を収集できるツールのセットです(最後のステートメントはどうにか証明できません。これは、機能とライブデモを提示したOracleエンジニアのステートメントです)。
アプリケーションが 1_7u40
JVM以上を実行している限り、このツールを使用できます。ランタイム情報の収集を有効にするには、特定のフラグでJVMを起動する必要があります。
デフォルトでは、JFRでJFRは無効になっています。 JFRを有効にするには、 -XX:+ FlightRecorder オプションを使用してJavaアプリケーションを起動する必要があります。 JFRは商用機能であり、Javaプラットフォーム、Standard Edition(Oracle Java SE AdvancedおよびOracle Java SE Suite)に基づく商用パッケージでのみ利用可能なため、 -XX:+ UnlockCommercialFeatures <を使用して商用機能を有効にする必要があります/ strong>オプション。
(引用 http:// docs。 oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7 )
本番IMOのプロファイリングに実行可能なオプションであるため、この回答を追加しました。
Eclipseプラグイン JFRとJMCをサポートし、ユーザーフレンドリーな情報を表示できます。
ツールは長年にわたって大幅に改善されました。最近では、これらのようなニーズがあるほとんどの人は、プロファイリングAPIの代わりにJavaの計測APIにフックするツールを使用しています。確かに他の例もありますが、 NewRelic および AppDynamics が思い浮かびます。計装ベースのソリューションは、通常、JVMでエージェントとして実行され、常にデータを収集します。従来のプロファイリングアプローチよりも高いレベル(ビジネストランザクション、Webトランザクション、データベーストランザクション)でデータをレポートし、必要に応じて(メソッドまたは行まで)より深く掘り下げることができます。監視とアラートを設定することもできるため、ページのロード時間やSLAに対するパフォーマンスなどのメトリックを追跡/アラートできます。これらの優れたツールを使用すると、プロダクションをプロダクションで実行する必要がなくなります。それらを実行するコストはごくわずかです。