継続的プロファイリングは、Java アプリケーションにおける CPU、メモリ、I/O に関連するパフォーマンスボトルネックの特定に役立ちます。パフォーマンスデータをメソッド名、クラス名、行番号ごとに分類して表示します。このデータを使用して、アプリケーションを最適化し、レイテンシーを削減し、スループットを向上させ、コストを削減できます。このトピックでは、Application Real-Time Monitoring Service (ARMS) で継続的プロファイリングを有効にし、プロファイリングデータを表示する方法について説明します。
ARMS アプリケーション監視は、新しい課金プランのユーザー向けに新しい監視詳細ページを提供しています。新しい課金プランの詳細については、「製品の課金 (新規)」をご参照ください。
新しい課金プランを有効にしていない場合は、[Apps] ページで [Switch to New Version] をクリックして、新しい監視詳細ページに切り替えることができます。
パフォーマンステストの結果、典型的な Spring Web アプリケーションですべての継続的プロファイリング機能を有効にした場合、CPU オーバーヘッドは約 5% 増加し、オフヒープメモリの使用量は約 50 MB 増加します。GC およびリクエストレイテンシーへの影響はごくわずかです。詳細については、「Java Agent v4.x を使用した継続的プロファイリングのパフォーマンステストレポート」をご参照ください。
前提条件
-
アプリケーションで ARMS アプリケーション監視を有効にし、エージェントを v2.7.3.5 以降にアップグレードする必要があります。手順については、「アプリケーション監視の概要」および「ARMS エージェントのアップグレード」をご参照ください。
-
アプリケーションの VPC に Object Storage Service (OSS) バケットへのアクセスを制限するポリシーがある場合は、ポリシーを更新する必要があります。継続的プロファイリングは、収集したデータを
arms-profiling-<regionId>という名前の専用 OSS バケットにアップロードして保存および処理します。このバケットをポリシーの許可リストに追加する必要があります。<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 ベースイメージはサイズを最適化するために、JDK からこれらのデバッグシンボルを削除することが多く、機能が正しく動作しなくなります。この機能が必要な場合は、Alpine 以外のベースイメージを使用することを推奨します。
継続的プロファイリングに推奨される JDK バージョン:
|
タイプ |
バージョン |
|
OpenJDK |
|
|
Oracle JDK |
|
継続的プロファイリングの有効化
-
ARMS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
アプリケーションリスト ページの上部で、目的のリージョンを選択し、目的のアプリケーション名をクリックします。
説明言語 列のアイコンには、次の意味があります。
:アプリケーション監視に接続された Java アプリケーション。
:アプリケーション監視に接続された Go アプリケーション。
:アプリケーション監視に接続された Python アプリケーション。[-]:Managed Service for OpenTelemetry に接続されたアプリケーション。
-
上部メニューで、 を選択します。
-
[継続的プロファイリング] セクションで、メインスイッチをオンにし、次に [IP ホワイトリスト] または [IP 範囲] を設定します。
-
保存 をクリックします。
継続的プロファイリングデータの表示
-
ARMS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
アプリケーションリスト ページの上部で、目的のリージョンを選択し、目的のアプリケーションの名前をクリックします。
説明言語 列のアイコンは、それぞれ次の意味を表します。
:アプリケーション監視に接続された Java アプリケーション。
:アプリケーション監視に接続された Go アプリケーション。
:アプリケーション監視に接続された Python アプリケーション。[-]:Managed Service for OpenTelemetry に接続されたアプリケーション。
-
上部メニューで、 を選択します。
-
左側のインスタンスリストで、対象のインスタンスを選択します。次に、ページの右側で、表示するデータの時間範囲を設定します。
-
右側の検索タブで、次の手順を実行してデータをフィルタリングし、集計分析を表示できます:
-
[時間ウィンドウサイズ] エリアで、スナップショット間隔を選択します。次に、グラフ上でドラッグしてスナップショットの時間範囲を選択します。
-
データタイプのドロップダウンリストから、CPU、JVM Heap、または JVM GC を選択します。
-
スナップショットリストには、選択したスナップショットの時間範囲内のデータが表示されます。スナップショットの詳細を表示するには、右上隅の集計分析をクリックします。
図 1. パフォーマンス分析
スナップショットの詳細ページには、[Performance analysis]、[Metric list]、[Snapshot list] の 3 つのタブがあります。[Performance analysis] タブでは、ドロップダウンリストから [CPU Time] などの分析タイプを選択し、表示モードを [Table]、[Both]、または [Flamegraph] に切り替えることができます。左側のリストには各メソッドが消費した時間が、右側のフレームグラフには呼び出しスタックが表示されます。
-
[Self] 列には、メソッド自体が消費した時間またはリソースが表示されます (子メソッドが消費した時間またはリソースは除外されます)。これにより、どのメソッドが内部で大量の時間またはリソースを消費しているかを特定できます。
-
[Total] 列には、メソッド自体とそのすべての子メソッドが消費した時間またはリソースが表示されます。これにより、呼び出しスタック全体の時間またはリソース消費に最も寄与しているメソッドを把握できます。
特定のホットスポットコードのトラブルシューティングを行うには、[Self] 列に注目するか、右側のフレームグラフの下部にある幅の広いバーを調べます。これらの幅の広いバーは、スタックの上位層における高リソース消費の根本原因を表しており、多くの場合、システムのパフォーマンスボトルネックを示しています。これらには細心の注意を払う必要があります。
図 2. メトリックリスト

図 3. スナップショットリスト
[Snapshot list] タブには、各時点のスナップショットデータが表示され、次の列が含まれます。
-
[Time]
-
[Snapshot size]
-
[CPU CORES]
-
[Memory allocations]
-
[Memory (TLAB)]
-
-
関連ドキュメント
継続的プロファイリング機能を使用して、高 CPU およびメモリ使用率の問題をトラブルシューティングできます。詳細については、次のトピックをご参照ください。
継続的プロファイリングを使用する際の一般的な問題については、「FAQ」をご参照ください。