Application Real-Time Monitoring Service (ARMS) の CPU 診断機能は、継続的プロファイリング技術を使用して、実行中の CPU スレッドのメソッドスタックスナップショットを定期的に収集し、CPU 使用率が高い根本原因を特定します。システムの CPU 使用率が高い場合、この機能は CPU 消費量が高いビジネスロジックメソッドを迅速に特定します。
CPU 診断機能を有効にすると、CPU オーバーヘッドが約 5% 増加します。事前に一定量の利用可能なリソースを確保しておく必要があります。
CPU 診断機能を有効にする
ARMS console にログインします。左側のナビゲーションペインで、 を選択します。
アプリケーションリスト ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。
説明言語 列に表示されるアイコンは、アプリケーションが記述されている言語を示します。
: Java アプリケーション
: Go アプリケーション
: Python アプリケーション
ハイフン (-): Managed Service for OpenTelemetry で監視されているアプリケーション。
左側のナビゲーションペインで、アプリケーション設定 をクリックします。表示されるページで、カスタム設定 タブをクリックします。
継続的プロファイリング セクションで、メインスイッチ と CPU ホットスポット をオンにして、アプリケーションインスタンスの IP アドレスまたは複数のインスタンスの CIDR ブロックを設定します。
タブの下部にある 保存 をクリックします。
変更は、アプリケーションを再起動しなくても有効になります。
継続的プロファイリング技術を使用してホットスポット CPU データを表示する
次の例は、CPU リソースを消費し、500 ミリ秒間実行されるメソッドを示しています。
public class CPUPressure {
// リクエストメソッド。
public void runBusiness() {
long start = System.currentTimeMillis(), period = 0;
while (period <= 500L) {
period = System.currentTimeMillis() - start;
}
}
}
ARMS console にログインします。左側のナビゲーションペインで、 を選択します。
アプリケーションリスト ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。
説明言語 列に表示されるアイコンは、アプリケーションが記述されている言語を示します。
: Java アプリケーション
: Go アプリケーション
: Python アプリケーション
ハイフン (-): Managed Service for OpenTelemetry で監視されているアプリケーション。
左側のナビゲーションペインで、継続的プロファイリング をクリックします。継続的プロファイリングページで、表示するインスタンスとクエリする期間を選択します。
単一ビュー タブで、データをクエリし、集計分析結果を表示できます。
説明次のパフォーマンス分析タイプを使用できます。
CPU 時間: 要求された CPU コアの数。
割り当て済みメモリ: 要求されたメモリサイズ。
割り当て: メモリ要求の数。メモリ要求の数に基づいて、頻繁にメモリを要求するメソッドを表示できます。
集計と分析 をクリックします。表示されるページで、プロファイリングタイプ パラメーターを CPU 時間 に設定します。
図の左側は、呼び出しに関係するすべてのメソッドの CPU 使用率リストで、右側はすべてのメソッド情報のフレームグラフです。
Self 列には、スタック内で各メソッドが消費する時間またはリソースが表示されます。子メソッドが消費する時間またはリソースは除外されます。このデータを使用して、自身のために過剰な時間またはリソースを費やしているメソッドを特定できます。
Total 列には、各メソッド自体に消費された時間またはリソースが表示されます。すべての子メソッドに消費された時間またはリソースも含まれます。このデータを使用して、最も多くの時間またはリソースを費やしているメソッドを特定できます。
前の図に基づいて、次の分析を実行します。
Self 列の値を昇順に並べ替えます。値が最も大きいメソッド java.lang.System.currentTimeMillis() を見つけてクリックします。関連するメソッドがフレームグラフに表示されます。
フレームグラフのスタックトップで、java.lang.System.currentTimeMillis() メソッドが最も幅の広いボックスを持っていることがわかります。
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 秒かかることを示しており、これはサンプルシナリオと論理的に一致します。