継続的プロファイリングは、CPU、メモリ、I/O の高い使用量に起因する Java アプリケーションのパフォーマンスボトルネックを特定するのに役立ちます。メソッド名、クラス名、行番号で分類された詳細な統計情報を提供します。このデータにより、コードを最適化し、レイテンシーを削減し、スループットを向上させ、コストを節約できます。このトピックでは、ARMS で継続的プロファイリングを有効にし、収集されたデータを表示する方法について説明します。
ARMS アプリケーションモニタリングは、新しい課金モデルを有効にしているユーザー向けに、新しいモニタリング詳細ページを提供します。新しい課金モデルの詳細については、「製品の課金 (新規)」をご参照ください。
古い課金プランをご利用の場合、[アプリケーションリスト] ページで [新バージョンに切り替え] をクリックすることで、新しいモニタリング詳細ページに切り替えることができます。
パフォーマンステストによると、一般的な Spring Web アプリケーションで継続的プロファイリングを完全に有効にすると、約 5% の CPU オーバーヘッドと 50 MB のオフヒープメモリオーバーヘッドが発生します。ガベージコレクション (GC) とリクエストレイテンシーへの影響はごくわずかです。詳細については、「Java エージェント 4.x の継続的プロファイリングパフォーマンステストレポート」をご参照ください。
前提条件
ご利用のアプリケーションを ARMS アプリケーションモニタリングに接続し、エージェントをバージョン 2.7.3.5 以降にアップグレード済みであること。手順については、「アプリケーションをアプリケーションモニタリングに接続」および「ARMS エージェントのアップグレード」をご参照ください。
ご利用のアプリケーションが、Alibaba Cloud Object Storage Service (OSS) バケットへのアクセスを制限するポリシーを持つ VPC にデプロイされている場合は、そのポリシーを更新する必要があります。継続的プロファイリングは、データを専用の ARMS OSS バケットにアップロードして保存および処理します。データ収集を確実に行うために、ARMS プロファイリングバケット (
arms-profiling-<regionId>) をポリシーの許可リストに追加してください。<regionId>は、アプリケーションがデプロイされているリージョンの ID に置き換えてください。たとえば、アプリケーションが中国 (杭州) リージョンにある場合、バケット名はarms-profiling-cn-hangzhouです。継続的プロファイリングは現在、OpenJDK と Oracle JDK のみをサポートしています。IBM OpenJ9 や Oracle GraalVM JDK はサポートしていません。
制限事項
オペレーティングシステムのカーネル
Linux カーネル 2.6.32-431.23.3.el6.x86_64 以降。
現在のカーネルバージョンを確認するには、uname -r コマンドを実行します。
JDK バージョン
ARMS の継続的プロファイリング機能は、Java 仮想マシンツールインターフェイス (JVM TI) を使用してアプリケーションのメソッドスタックを取得し、ランタイムの CPU およびメモリ使用量の詳細を提供します。JVM TI には既知のクラッシュの問題があり、アプリケーションの障害を引き起こす可能性があります。この問題は、OpenJDK 8u352、11.0.17、17.0.5、および Oracle JDK 11.0.21、17.0.9 で修正されています。ARMS チームのテストでは、この問題はまれであり、特定のシナリオでのみトリガーされることが示されていますが、古い JDK バージョンを使用すると安定性のリスクが生じます。ARMS は、サポートされていない JDK バージョンで継続的プロファイリングを有効にすることを妨げません。一時的にこの機能を有効にし、IP ホワイトリストを使用してその範囲を制限することができます。ただし、アプリケーションの安定性のために、JDK をサポートされているバージョンにアップグレードすることを強く推奨します。古い JDK バージョンで継続的プロファイリングを使用すると、アプリケーションがクラッシュする可能性があります。
継続的プロファイリングには、JDK のデバッグシンボルが必要です。サイズを最適化するために、Alpine ベースイメージではこれらのデバッグシンボルが削除されていることが多く、これにより機能が正しく動作しなくなる可能性があります。この機能を使用するには、Alpine 以外のベースイメージを使用することを推奨します。
推奨 JDK バージョン:
JDK タイプ | バージョン |
OpenJDK |
|
Oracle JDK |
|
継続的プロファイリングの有効化
ARMS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[アプリケーション一覧] ページで、上部のナビゲーションバーでリージョンを選択し、アプリケーション名をクリックします。
説明[言語] 列のアイコンは、次のとおりです。
:アプリケーションモニタリングに接続された Java アプリケーション。
:アプリケーションモニタリングに接続された Go アプリケーション。
:アプリケーションモニタリングに接続された Python アプリケーション。-:Trace Explorer に接続されたアプリケーション。
上部のナビゲーションバーで、 を選択します。
[継続的プロファイリング] セクションで、メインスイッチをオンにし、[IP ホワイトリスト] または [IP 範囲] を設定します。
[保存]をクリックします。
継続的プロファイリングデータの表示
ARMS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[アプリケーション一覧] ページで、トップナビゲーションバーからリージョンを選択し、アプリケーション名をクリックします。
説明[言語] 列のアイコンは、次のとおりです。
:アプリケーションモニタリングに接続された Java アプリケーション。
:アプリケーションモニタリングに接続された Go アプリケーション。
:アプリケーションモニタリングに接続された Python アプリケーション。-:Trace Explorer に接続されたアプリケーション。
上部のナビゲーションバーで、 を選択します。
左側のインスタンスリストでインスタンスを選択します。次に、右側のペインで時間範囲を指定します。
[クエリ] タブでは、データをフィルターして、集計分析を表示できます。

[時間ウィンドウサイズ] エリア (セクション ①) で、スナップショットの持続時間を選択し、チャート上でポインターをドラッグして時間範囲を選択します。
セクション ② のドロップダウンリストから、データ型 (CPU、JVM ヒープ、または JVM GC) を選択します。
セクション ③ では、選択した時間範囲内のスナップショットのリストが表示されます。スナップショットの詳細を表示するには、右上隅にある[集計分析]をクリックします。
図 1. パフォーマンス分析

Self 列には、子メソッドを除いた、メソッド自体が消費した時間またはリソースが表示されます。これは、大量のリソースを消費するメソッドを特定するのに役立ちます。
Total 列には、メソッドとその子メソッドが消費した時間またはリソースが表示されます。これは、呼び出しスタックの全体的な実行時間またはリソース使用量に最も寄与するメソッドを理解するのに役立ちます。
特定のコードホットスポットを特定するには、Self 列に注目するか、右側のフレームグラフの下部にある幅の広いフレームを調べます。幅の広いフレームは、高いリソース消費の根本原因を示しており、多くの場合、システムのパフォーマンスボトルネックを示しています。
図 2. メトリックリスト

図 3. スナップショットリスト

関連ドキュメント
継続的プロファイリングを使用して高い CPU およびメモリ使用率をトラブルシューティングする手順については、次のトピックをご参照ください:
継続的プロファイリングに関する一般的な問題については、「よくある質問」をご参照ください。