アプリケーションモニタリングの継続的プロファイリング機能は、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 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. スナップショット

参照
継続的プロファイリング機能を使用する場合:
CPU 使用率とメモリ使用率が高い問題のトラブルシューティングは、以下を参照してください。
よくある問題のトラブルシューティング。