新しい Java 1.6 JDK ツールであるVisualVMを使用して実稼働アプリケーションをプロファイリングしたことのある人はいますか?また、プロファイリング中のアプリケーションのパフォーマンスはどうですか?
ドキュメントには、本番環境と開発環境の両方で使用できるように設計されていると書かれていますが、他のプロファイリング ツールを使用した以前のプロファイリングの経験に基づいて、私は躊躇しています。
私は個人的に VisualVM を使用したことはありませんが、今日このブログ記事を目にしたところ、役に立つ情報が得られるかもしれません。彼は、それを使用した本番アプリのプロファイリングについて語っています。
アプリケーションを監視するだけであれば、VisualVM をリモートで実行してもそれほど遅くなることはありません。システムが崩壊の危機に瀕していない場合、私はまだ何の問題も見ていません. 基本的には、JVM の粗粒度のビルトイン インストルメンテーションから情報を読み取るだけです。ただし、プロファイリングを開始すると、他のプロファイラーと同じ問題が発生します。基本的に、それらはすべてほぼ同じように機能するため、多くの場合、JVM のサポートを使用します。
ファイアウォールの問題が原因で、多くの人が VisualVM をリモートで実行することに問題を抱えていますが、いくつかのシステム プロパティを設定して、ssh 経由で Visual VM をリモートで実行することもできます。
開発ボックスで試してみたところ、プロファイリングをオフにすると、Tomcat が予期せずシャットダウンすることがわかりました。これを本番環境に展開することについては非常に慎重になりますが、代わりにステージング環境で負荷をシミュレートできますか? 本物には及ばないけど、失敗してもクビにはならないかも…
以前に VisualVM を使用して、ローカルで実行されているもののプロファイルを作成したことがあります。大きな利点は、起動するだけで、実行中の JVM に接続できることです。以前に使用した他のプロファイリング ツールよりも使いやすく、オーバーヘッドも少ないようです。
サンプリングを行っていると思います。CPU を集中的に使用するアプリケーションのオーバーヘッドは、それほど大きくないように見えました。私は何も測定しませんでした (ツールのパフォーマンスではなく、アプリのパフォーマンスに関心がありました) が、プロファイリングで見慣れた 10 倍の速度低下は見られませんでした。
VisualVMは、JDKに含まれる前からずっと使用しています。システムのパフォーマンスへの影響はごくわずかです。システムのパフォーマンスに問題が発生することに気づいたことはありませんが、Javaサーバーには、少し余分な負荷をサポートするのに十分なヘッドルームがありました。サーバーが完全にタックアウトされたレベルで実行されていて、実行中のVisualVMを処理できない場合は、別のサーバーを購入する必要がある可能性が高いと言えます。実稼働サーバーには、ある程度のメモリヘッドルームが必要です。そうでない場合、発生するのを待っている災害が発生します。
Visual VM と同じ基盤を使用する Net Beans プロファイラーを使用しました。
以前のバージョンの Weblogic を使用していたため、1.5 JVM を使用していたため、動的接続を行うことができませんでした。私がプロファイリングしていたアプリケーションには数千のクラスがあり、プロファイラーがそれらすべてを計測している間、私のワークステーションはほとんど使用できませんでした。計測が完了すると、システムの動作は遅くなりましたが、完全に使用できなくなるわけではありませんでした。スローダウンの程度は、何をキャプチャする必要があるかによって異なります。基本的な CPU メトリクスはかなり軽量です。メモリ割り当てのプロファイルを作成すると、処理が大幅に遅くなります。
本番システムでは使用しません。スローダウンの可能性は別として、設定を変更するとプロファイラーがクラスを再インストルメントしてリロードするため、最終的に PermGen スペースが不足しました。(これは 1.6 エージェントで修正されるかもしれませんが、わかりません)
私は VVM(VavaVoom?) を非常に広範囲に使用しており、VM から基本データを取得するだけで、ライト モード、つまりプロファイリングなしでチャームのように動作します。しかし、プロファイリングを開始すると、多くのクラスが存在するようになり、かなりの速度低下が発生します。クラスのリロードと再定義が難しいため、純粋に2テラのメモリを備えた128コアボードを使用している場合でも、本番環境ではプロファイリングしません。サーバークラスローダーは別のものであり、サーバー実装ごとに異なります。 、本番環境でそれらに干渉することはあまり良い考えではありません.
VisualVM を使用して、別のコンピューターからサーバーにリモート接続することができます。「Remote」ノードを右クリックして、「Add Remote Host」と言うだけです。
これにより、実行中のパフォーマンスに影響を与える VisualVM のオーバーヘッド (存在する場合) が少なくとも排除されます。
これにより、特に本番環境でのすべてのパフォーマンスの問題が解消されるわけではありませんが、少しは役に立ちます。