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

:CPU 診断機能を使用して CPU 使用率が高い問題を診断する

最終更新日:Dec 30, 2024

Application Real-Time Monitoring Service (ARMS) の CPU 診断機能は、継続的プロファイリング技術を使用して、実行中の CPU スレッドのメソッドスタックスナップショットを定期的に収集し、CPU 使用率が高い根本原因を特定します。システムの CPU 使用率が高い場合、この機能は CPU 消費量が高いビジネスロジックメソッドを迅速に特定します。

重要

CPU 診断機能を有効にすると、CPU オーバーヘッドが約 5% 増加します。事前に一定量の利用可能なリソースを確保しておく必要があります。

CPU 診断機能を有効にする

  1. ARMS console にログインします。左側のナビゲーションペインで、アプリケーションモニタリング > アプリケーションリスト を選択します。

  2. アプリケーションリスト ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。

    説明

    言語 列に表示されるアイコンは、アプリケーションが記述されている言語を示します。

    Java图标: Java アプリケーション

    image: Go アプリケーション

    image: Python アプリケーション

    ハイフン (-): Managed Service for OpenTelemetry で監視されているアプリケーション。

  3. 左側のナビゲーションペインで、アプリケーション設定 をクリックします。表示されるページで、カスタム設定 タブをクリックします。

  4. 継続的プロファイリング セクションで、メインスイッチCPU ホットスポット をオンにして、アプリケーションインスタンスの IP アドレスまたは複数のインスタンスの CIDR ブロックを設定します。

  5. タブの下部にある 保存 をクリックします。

    変更は、アプリケーションを再起動しなくても有効になります。

継続的プロファイリング技術を使用してホットスポット CPU データを表示する

次の例は、CPU リソースを消費し、500 ミリ秒間実行されるメソッドを示しています。

public class CPUPressure {

    // リクエストメソッド。
   public void runBusiness() {
        long start = System.currentTimeMillis(), period = 0;
        while (period <= 500L) {
            period = System.currentTimeMillis() - start;
        }
    }
}
  1. ARMS console にログインします。左側のナビゲーションペインで、アプリケーションモニタリング > アプリケーションリスト を選択します。

  2. アプリケーションリスト ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。

    説明

    言語 列に表示されるアイコンは、アプリケーションが記述されている言語を示します。

    Java图标: Java アプリケーション

    image: Go アプリケーション

    image: Python アプリケーション

    ハイフン (-): Managed Service for OpenTelemetry で監視されているアプリケーション。

  3. 左側のナビゲーションペインで、継続的プロファイリング をクリックします。継続的プロファイリングページで、表示するインスタンスとクエリする期間を選択します。

  4. 単一ビュー タブで、データをクエリし、集計分析結果を表示できます。

    説明

    次のパフォーマンス分析タイプを使用できます。

    • CPU 時間: 要求された CPU コアの数。

    • 割り当て済みメモリ: 要求されたメモリサイズ。

    • 割り当て: メモリ要求の数。メモリ要求の数に基づいて、頻繁にメモリを要求するメソッドを表示できます。

    image

  5. 集計と分析 をクリックします。表示されるページで、プロファイリングタイプ パラメーターを CPU 時間 に設定します。

    image

    図の左側は、呼び出しに関係するすべてのメソッドの CPU 使用率リストで、右側はすべてのメソッド情報のフレームグラフです。

    • Self 列には、スタック内で各メソッドが消費する時間またはリソースが表示されます。子メソッドが消費する時間またはリソースは除外されます。このデータを使用して、自身のために過剰な時間またはリソースを費やしているメソッドを特定できます。

    • Total 列には、各メソッド自体に消費された時間またはリソースが表示されます。すべての子メソッドに消費された時間またはリソースも含まれます。このデータを使用して、最も多くの時間またはリソースを費やしているメソッドを特定できます。

    前の図に基づいて、次の分析を実行します。

    1. Self 列の値を昇順に並べ替えます。値が最も大きいメソッド java.lang.System.currentTimeMillis() を見つけてクリックします。関連するメソッドがフレームグラフに表示されます。

      image

    2. フレームグラフのスタックトップで、java.lang.System.currentTimeMillis() メソッドが最も幅の広いボックスを持っていることがわかります。

    3. java.lang.System.currentTimeMillis() メソッドは Java Development Kit (JDK) のライブラリ関数であるため、さらに上に検索する必要があります。java.lang.System.currentTimeMillis() メソッドとその親メソッド com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness() を見つけることができます。アプリケーションで定義された最初のサービスメソッドとして、com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness() メソッドは 28.63 秒を消費し、スタックの 91.44% を占めます。したがって、指定された期間に com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness() メソッドが大量のリソースを消費するという結論を出すことができます。このメソッドを使用して、関連するメソッドのロジックを分析し、最適化できるかどうかを確認できます。

上記の分析は、com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness() メソッドが 1 分で 28.63 秒かかることを示しており、これはサンプルシナリオと論理的に一致します。