すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:CPU ホットスポットプロファイリングによる高い CPU 使用率の診断

最終更新日:Sep 11, 2026

本番環境で CPU 使用率が急上昇した場合、メトリクスだけでは原因となっているメソッドを正確に特定することが困難な場合があります。Application Real-Time Monitoring Service (ARMS) は、アクティブな CPU スレッドを継続的にプロファイリングし、メソッドレベルのスタックスナップショットを定期的にキャプチャします。これらのスナップショットはフレームグラフとメソッドレベルの統計に集計され、どのコードパスが最も多くの CPU サイクルを消費しているかを特定するのに役立ちます。

重要

CPU 診断を有効にすると、約 5% の CPU オーバーヘッドが発生します。この機能を有効にする前に、インスタンスに十分なヘッドルームがあることを確認してください。

フレームグラフの仕組み

ARMS は、サンプリングされたスタックスナップショットをフレームグラフに集計します。フレームグラフは、2 つのディメンションで構成されます。

ディメンション意味読み方
幅 (X 軸)メソッドが消費した合計 CPU 時間の割合ボックスが広いほど CPU 時間が長くなります
深さ (Y 軸)呼び出し階層—下部がエントリーポイント、上部がリーフメソッドCPU サイクルが実際に消費されているメソッドについては、グラフの上部を参照してください
水平方向の位置は時間の経過を表すものではありません。隣り合って配置された 2 つのメソッドが、必ずしも連続して実行されたわけではありません。

自己時間と合計時間

2 つのメトリクスは、個別に負荷が高いメソッドと、その子メソッドを通じて高い CPU 使用率に寄与するメソッドを区別するのに役立ちます。

メトリクス定義使用場面
自己時間スタック内でメソッドが消費する時間またはリソース。子メソッドが消費する時間またはリソースは除きます個別に負荷が高いメソッドの特定
合計時間メソッドが消費する時間またはリソース。すべての子メソッドが消費する時間またはリソースを含みます全体的な CPU 時間に最も寄与する呼び出しパスの特定

自己時間 = 合計時間 - 子の合計時間の合計。 たとえば、あるメソッドの合計時間が 309 ms で、その唯一の子の合計時間が 112 ms の場合、親の自己時間は 197 ms (309 - 112) です。

CPU 診断の有効化

  1. ARMS コンソールにログインします。左側のメニューで、[Application Monitoring] > [Application List] を選択します。

  2. [Application List] ページで、上部のメニューでリージョンを選択し、アプリケーションの名前をクリックします。

    [Language] 列のアイコンは、アプリケーションの言語を示します:Java图标 Java image Go image Python ハイフン ([-]):Managed Service for OpenTelemetry を使用して監視されるアプリケーション。
  3. 左側のメニューで、[Application Settings] をクリックします。[Custom Configuration] タブをクリックします。

  4. [Continuous profiling] セクションで、[Main switch] と [CPU hotspot] をオンにし、アプリケーションインスタンスの IP アドレス、または複数インスタンス用の CIDR ブロックを指定します。

  5. [Save] をクリックします。

変更はすぐに有効になり、アプリケーションを再起動する必要はありません。

根本原因メソッドの特定

次のウォークスルーでは、500 ミリ秒間ビジーウェイトする Java メソッドを使用して、持続的な CPU 消費をシミュレートします。

public class CPUPressure {

    // 呼び出しごとに CPU を 500 ms 保持するビジーウェイトループ
    public void runBusiness() {
        long start = System.currentTimeMillis(), period = 0;
        while (period <= 500L) {
            period = System.currentTimeMillis() - start;
        }
    }
}

ステップ 1:プロファイリングビューを開く

  1. ARMS コンソールにログインします。左側のメニューで、[Application Monitoring] > [Application List] を選択します。

  2. [Application List] ページで、上部のメニューでリージョンを選択し、アプリケーションの名前をクリックします。

    [Language] 列のアイコンは、アプリケーションの言語を示します:Java图标 Java image Go image Python ハイフン ([-]):Managed Service for OpenTelemetry を使用して監視されるアプリケーション。
  3. 左側のメニューで、[Continuous profiling] をクリックします。対象のインスタンスと時間範囲を選択します。

  4. [Single View] タブで、データをクエリし、集計結果を表示します。

    3 つのプロファイリングタイプが利用可能です。

    • CPU 時間:各メソッドが消費した CPU コア。

    • 割り当て済みメモリ:割り当てられたメモリのバイト数。

    • 割り当て:メモリ割り当て呼び出しの数。頻繁に割り当てを行うメソッドを特定するのに役立ちます。

    Single view with aggregation analysis

ステップ 2:負荷の高いメソッドの特定

  1. [Aggregation & Analysis] をクリックします。[Profiling Type] を [CPU Time] に設定します。左側のパネルには、サンプリングされた呼び出しスタックに含まれるすべてのメソッドが一覧表示されます。右側のパネルには、フレームグラフが表示されます。

    Aggregation & Analysis with CPU Time selected

  2. [Self] 列を昇順でソートします。Self 値が最も大きいメソッドを見つけてクリックします。この例では、java.lang.System.currentTimeMillis() が一番上に表示されます。これをクリックすると、フレームグラフ内の対応するボックスがハイライトされます。

    Flame graph highlighting currentTimeMillis

  3. フレームグラフで、currentTimeMillis() がスタックの最上部で最も幅の広いボックスであることを確認します。これは、最も多くの自己時間またはリソースを消費したことを意味します。

ステップ 3:アプリケーションコードへのトレースバック

currentTimeMillis() は JDK のライブラリメソッドのため、コールスタックを 1 階層下って、呼び出し元のアプリケーションメソッドである com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness() を探します。

このメソッドは 1 分間で 28.63 秒を消費し、合計 CPU 時間の 91.44% を占めました。これは想定どおりの動作です。runBusiness() は、呼び出しごとに 500 ms のビジーウェイトを行うため、負荷時に CPU 使用率の大部分を占めます。

関連トピック