アプリケーションモニタリングの継続的プロファイリング機能は、Java プログラムにおける CPU、メモリ、または I/O によって発生するボトルネックを効果的に発見し、メソッド名、クラス名、および行番号別に統計データを表示できます。 これにより、開発者はプログラムを最適化し、レイテンシを削減し、スループットを向上させ、コストを節約できます。 このトピックでは、継続的プロファイリング機能を有効にする方法と、プロファイリングデータを表示する方法について説明します。
継続的プロファイリング機能のパフォーマンステストが実施されました。 主流の Spring Web アプリケーションのすべての機能が有効になっている場合、CPU 使用率は約 5% 増加し、オフヒープメモリ使用率は約 50 MB 増加し、ガベージコレクション ( GC ) とリクエストレイテンシはほとんど増加しませんでした。 その他のテスト結果については、「Java v4.x 用 ARMS エージェントの継続的プロファイリング技術のパフォーマンステストレポート」をご参照ください。
前提条件
アプリケーションモニタリング Pro 版と従量課金モードのみが継続的プロファイリングをサポートしています。 Pro 版のアクティブ化方法については、「従量課金」をご参照ください。 従量課金モードへの切り替え方法については、「課金」をご参照ください。
継続的プロファイリング機能は、Alibaba Finance Cloud および Alibaba Gov Cloud の一部のリージョンではサポートされていません。 これらのリージョンでこの機能を使用する場合は、DingTalk グループ ( ID : 22560019672 ) に参加して技術サポートを受けてください。
継続的プロファイリングデータは 7 日間のみ保存できます。
アプリケーションはアプリケーションモニタリングによって監視されています。 ARMS エージェントのバージョンは 2.7.3.5 以降です。 アプリケーションモニタリングでアプリケーションを監視する方法については、「アプリケーションモニタリングの概要」をご参照ください。 ARMS エージェントをアップグレードする方法については、「ARMS エージェントの更新」をご参照ください。
アプリケーションが存在する VPC のアクセス制御ポリシーで、Object Storage Service ( OSS ) バケットが指定されています。 OSS バケットは、プロファイリングデータを保存するために使用されます。 ポリシーでバケットが指定されていない場合、データは収集されません。 OSS バケットの名前は arms-profiling-<regionId> です。 <regionId> はリージョン ID に置き換えます。 たとえば、アプリケーションが中国 (杭州) リージョンにデプロイされている場合、バケット名は arms-profiling-cn-hangzhou です。
継続的プロファイリング機能は、OpenJDK および Oracle JDK でのみ使用できます。
制限事項
オペレーティングシステムカーネル
オペレーティングシステムカーネルは、Linux 2.6.32-431.23.3.el6.x86_64 以降である必要があります。
uname -r コマンドを実行して、カーネルバージョンをクエリできます。
JDK バージョン
継続的プロファイリング機能は、Java Virtual Machine Tool Interface ( JVM TI ) を使用して、アプリケーションのメソッドスタックを取得します。 これにより、アプリケーションの実行時の CPU 使用率とメモリ使用率の詳細を取得できます。 JVM TI はアプリケーションのクラッシュを引き起こす可能性があります。 次の JDK バージョンでは、この問題が修正されています: OpenJDK 8u352、11.0.17、および 17.0.5、Oracle JDK 11.0.21 および 17.0.9。 詳細については、「AsyncGetCallTrace may crash JVM on guarantee」をご参照ください。 その他の JDK バージョンについては、アプリケーションモニタリング R&D チームがさまざまなテストを実施し、アプリケーションのクラッシュはごく少数のシナリオでしか発生しないことを確認しています。 アプリケーションモニタリングは、継続的プロファイリング機能を強制的に無効にすることはありません。 必要に応じて、特定のアプリケーション IP アドレスに対してこの機能を使用できます。 ただし、アプリケーションの安定性を確保するために、要件を満たす JDK バージョンを使用することをお勧めします。
継続的プロファイリング機能は、主に JDK のデバッグシンボルに依存しています。 ただし、Alpine ベースイメージは、メモリ使用量を制御するために JDK からデバッグシンボルを削除します。 この方法では、継続的プロファイリング機能を期待どおりに使用することはできません。 Alpine ベースイメージを使用しないことをお勧めします。
次の表に、推奨される JDK バージョンを示します。
JDK | バージョン |
OpenJDK |
|
Oracle JDK |
|
ARMS コンソールで継続的プロファイリング機能を有効にする
ARMS console にログインします。 左側のナビゲーションウィンドウで、 を選択します。
[アプリケーションリスト] ページで、上部ナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。
説明言語列に表示されるアイコンは、アプリケーションが記述されている言語を示します。
: Java アプリケーション
: Go アプリケーション
: Python アプリケーションハイフン ( - ) : Managed Service for OpenTelemetry で監視されるアプリケーション。
左側のナビゲーションウィンドウで、[アプリケーション設定] をクリックします。 表示されるページで、[カスタム設定] タブをクリックします。
[継続的プロファイリング] セクションの [カスタム構成] タブで、[メインスイッチ] をオンにし、[IP ホワイトリスト] または [ネットワークセグメントアドレス] パラメーターを構成します。
[カスタム設定] タブで、[保存] をクリックします。
プロファイリングデータを表示する
ARMS console にログインします。 左側のナビゲーションウィンドウで、 を選択します。
[アプリケーションリスト] ページで、上部ナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。
説明言語列に表示されるアイコンは、アプリケーションが記述されている言語を示します。
: Java アプリケーション
: Go アプリケーション
: Python アプリケーションハイフン ( - ) : Managed Service for OpenTelemetry で監視されるアプリケーション。
左側のナビゲーションウィンドウで、[継続的プロファイリング] をクリックします。
アプリケーションインスタンスリストで、アプリケーションインスタンスを選択します。 ページの右側で、期間を設定します。
右側ウィンドウの [単一ビュー] タブで、次の操作を実行してデータをクエリし、集約分析結果を表示します。

[タイムウィンドウサイズ] セクション ( アイコン 1 ) で、スナップショット期間を選択し、折れ線グラフをドラッグして期間を選択します。
ドロップダウンリスト ( アイコン 2 ) から、表示するデータ ( CPU、JVM ヒープ、JVM GC に関するデータ ) を選択します。
図のように、期間内 ( アイコン 3 ) のデータが表示されます。 [集約分析] をクリックして、スナップショットの詳細を表示できます。
図 1. パフォーマンス分析

Self 列には、各メソッドがスタック内で消費する時間またはリソースが表示されます ( 子メソッドが消費する時間またはリソースは除く ) 。 このデータを使用して、自身のために過剰な時間またはリソースを費やしているメソッドを特定できます。
Total 列には、各メソッドが消費する時間またはリソースが表示されます ( すべての子メソッドが消費する時間またはリソースを含む ) 。 このデータを使用して、最も多くの時間またはリソースを費やしているメソッドを特定できます。
ホットスポットコードを分析する場合、Self 列または右側フレームグラフの下部にある幅の広いフレームに注目することで、時間のかかるメソッドを見つけることができます。 通常、幅の広いフレームはシステムパフォーマンスのボトルネックを示します。
図 2. メトリクス

図 3. スナップショット

[比較ビュー] タブでは、2 つの期間に生成されたデータを比較および分析できます。
参照
継続的プロファイリング機能を使用する場合:
次の情報を参照して、CPU 使用率とメモリ使用率が高い問題をトラブルシューティングします。
一般的な問題のトラブルシューティングを行います。