このトピックでは、継続的プロファイリングの使用に関するよくある質問に回答します。
継続的プロファイリングを有効にしてもデータが表示されない
設定が正しいことを確認してください。設定された CIDR ブロックにアプリケーションインスタンスの IP アドレスが含まれていることを確認してください。
3.1.4 より前のバージョンのエージェントを使用している場合、Alpine ベースイメージとの互換性の問題により、プロファイリングエンジンが失敗することがあります。この問題はバージョン 3.1.4 で修正されています。安定性とデータの整合性を確保するために、エージェントをバージョン 3.1.4 以降にアップグレードすることを推奨します。
説明Alpine Linux ベースイメージを使用しているかどうかを確認するには、「関連操作」をご参照ください。
継続的プロファイリングは、データ収集に強化されたオープンソースの Async Profiler を使用しており、複数の Async Profiler を同時にマウントすることはサポートしていません。アプリケーションが Pyroscope エージェントの継続的プロファイリング機能も使用している場合、アプリケーションの起動に失敗することがあります。
継続的プロファイリングのページで、クエリ時間を 8 時間早めて設定し、データが表示されるか確認してください。データが表示される場合、アプリケーションのタイムゾーンが UTC+0 に設定されている可能性があります。これにより、UTC+8 と比較して 8 時間のデータ書き込み遅延が発生します。
解決策:アプリケーションに環境変数を追加して、タイムゾーンを UTC+8 に調整してください。
説明まず、継続的プロファイリングのページで現在の Pod 名でフィルタリングし、過去 8 時間以内の複数回のコンテナ再起動による混乱を避けてください。
Key: JAVA_TOOL_OPTIONS, Value: -Duser.timezone=GMT+8この問題は、エージェントのバージョン 4.1.10 で修正されています。これが問題であることを確認した場合、エージェントをバージョン 4.1.10 以降にアップグレードすることもできます。
アプリケーションが他の Async Profiler 動的ライブラリをマウントしているかどうかを確認します:
次のコマンドを実行します。
[pid]をアプリケーションのプロセス ID に置き換えてください。lsof -p [pid] | grep libasync結果に以下に示すような Alibaba Cloud 以外の動的ライブラリが含まれている場合、アプリケーションは独自の Async Profiler 動的ライブラリを使用しています。このライブラリは Application Real-Time Monitoring Service (ARMS) と互換性がありません。ARMS の機能を使用するには、独自の動的ライブラリを削除する必要があります。
/home/admin/xxx/.default/temp/libasyncProfiler1309163652530490111.so
新しい継続的プロファイリングでストレージ料金が変更された理由
報告されるボリュームが変更された主な理由は次のとおりです:
継続的プロファイリングは、元の継続的プロファイリング機能と完全に互換性のある新しい機能です。複数インスタンスにまたがる集計クエリ、スレッドレベルの分析、および Copilot によるインテリジェントなフレームグラフ分析をサポートしています。
ストレージ構造が変更されました。ユーザーがプロファイリングデータの二次分析を実行できるように、ストレージ媒体が組み込みの Object Storage Service (OSS) からアカウント内の Simple Log Service (SLS) インスタンスに移行しました。SLS プロジェクトは
proj-xtrace-<encode>-<region-id>で、SLS Logstore はlogstore-profilingです。この変更は、保存されるプロファイリングデータの量と、それに対応するストレージ料金に影響します。
データクエリでサポートされる時間範囲
継続的プロファイリングデータは 7 日間保存されます。この期間のデータをクエリできます。
ヒープメモリ監視によるメモリ使用量と、継続的プロファイリングのメモリホットスポットで検出されたメモリ使用量が異なるのは正常ですか?
継続的プロファイリングは、指定された期間内のヒープメモリ割り当てのみを記録し、プロセスの総メモリ使用量を記録するものではありません。
CPU 診断にはデータがあるが、メモリ診断にはデータがない
この問題は通常、エージェントのバージョン 3.1.4 以降で発生します。
メモリ診断にデータがないのは、通常、Alpine ベースイメージを使用していることが原因です。Alpine ベースイメージは、サイズを削減するために JDK のデバッグシンボルを削除します。これにより、継続的プロファイリングが正しく機能しなくなります。この問題を解決するには、イメージに JDK のデバッグシンボルをインストールするか、Alpine 以外のベースイメージを使用してください。一部の JDK バージョンには対応するデバッグシンボルパッケージがなく、インストールに失敗することがあることに注意してください。
お使いの環境の JDK にデバッグシンボルが含まれているかどうかを確認するには、「お使いの環境の JDK にデバッグシンボルが含まれているかどうかの確認」をご参照ください。
コードホットスポットにデータがない、またはデータが期待どおりでない理由
ホットスポットプロファイリングは、Alibaba Dragonwell JDK を含む、JDK の仮想スレッドまたは類似の技術を使用するアプリケーションではサポートされていません。
コードホットスポット機能は、SkyWalking プロトコルではサポートされていません。プロトコルの種類は、トレースのスパン詳細で確認できます。
コードホットスポット機能には、エージェントのバージョン 3.1.4 以降が必要です。それ以前のバージョンでは、この機能はサポートされていません。
4.2.1 より前のバージョンのエージェントは、同期呼び出しのみをサポートしており、完全なデータを収集できない場合があります。非同期呼び出しのデータが欠落することがあります。たとえば、Spring Cloud Gateway、Undertow、または Lettuce を使用すると、非同期のスレッド切り替えが発生し、不正確なデータ収集につながる可能性があります。エージェントのバージョン 4.2.1 以降では、これらの問題に対する最適化が含まれています。エージェントを最新バージョンにアップグレードすることを推奨します。
コードホットスポット機能は、固定レートでサンプリングされたトレースでのみサポートされます。エラーサンプリング (s9) や低速サンプリング (s10) など、固定でないサンプリングレートで収集されたトレースではサポートされていません。これは、高いパフォーマンスオーバーヘッドを引き起こすためです。これらのサンプリングタイプは、トレースが完了した後にのみトリガーされます。サンプリングタイプを判断するには、スパンの属性にある sample.reason フィールドを確認できます。
固定でないサンプリングレートで収集されたトレースについては、[Trace Analysis] ページに移動してください。[Traces with Code Hotspots] パラメーターを使用して、コードホットスポットを含むトレースをフィルタリングし、問題を診断してください。
エージェントのバージョン 4.2.1 以降を使用している場合、収集された実行時間が外部スパンによって記録された時間よりも大幅に短くなることがあります。これは、アプリケーションが Spring Cloud Gateway などの非同期、非ブロッキング I/O (NIO) フレームワークを使用している場合に発生する可能性があります。これらのフレームワークは、アップストリームサービスからリクエストを受信したり、ダウンストリームサービスにリクエストを送信したりする際に、データが準備できていなければスレッドをブロックしません。代わりに、スレッドは即座に戻り、他のタスクを実行できるため、スレッドの利用率が向上します。スレッドが I/O を待機してブロックされないため、パフォーマンスボトルネックは現在のアプリケーションにはありません。この場合、コードホットスポットで収集された時間はスパンの持続時間よりも大幅に短くなる可能性があります。アップストリームまたはダウンストリームアプリケーションのリクエスト処理、あるいはネットワークにボトルネックがないか確認する必要があります。
継続的プロファイリングのパフォーマンスオーバーヘッド
パフォーマンステストによると、継続的プロファイリングのオーバーヘッドは次のとおりです:標準的な Spring Web アプリケーションで、毎秒 500 トランザクション (TPS) のシナリオですべての機能を有効にした場合、CPU オーバーヘッドは約 5% 増加し、オフヒープメモリのオーバーヘッドは約 50 MB 増加します。ガベージコレクション (GC) とリクエストレイテンシの増加は顕著ではありません。
極端なケースでは、メモリホットスポットプロファイリングにレート制限がありません。アプリケーションが非常に頻繁にメモリを割り当てる場合、1 分あたり数万件などの大量のイベントが生成される可能性があります。これは P99 レイテンシに影響を与える可能性があります。この問題を解決するには、メモリプロファイリングを無効にすることができます。
この問題はバージョン 4.1.10 で修正されています。エージェントをバージョン 4.1.10 以降にアップグレードすることもできます。
アプリケーション内の JFR 関連スレッド
継続的プロファイリング機能は、JDK Flight Recorder (JFR) スレッドを作成します。これらのスレッドは、主に 4.1.10 より前のバージョンのエージェントで見られます。エージェントのバージョン 4.1.10 以降では JFR スレッドは作成されません。
これらのスレッドは、アプリケーションにパフォーマンスボトルネックを引き起こしません。
継続的プロファイリングのスイッチを動的にオフにしても、スレッドはすぐには破棄されません。アプリケーションが再起動した後にのみ消えます。
アプリケーション起動時間における継続的プロファイリング
継続的プロファイリングは、アプリケーションの起動を遅くすることがあります。これは、JDK にデバッグシンボルがなく、クラスローダーが多くのメソッドをロードする場合に発生する可能性があります。アプリケーションの起動後は、実行時のパフォーマンスに影響はありません。
この問題は、エージェントのバージョン 4.2.1 で修正されています。このバージョンにエージェントをアップグレードすることで、問題を解決できます。
フレームグラフの総メモリが実際に設定されたメモリ制限を超える理由
継続的プロファイリングのデータは、ホストのメモリ設定とは直接関係ありません。分析期間中に割り当てられたヒープメモリの総量を示します。ガベージコレクションのため、この量がホストのメモリ設定よりも大きくなるのは正常です。
OpenJ9 JDK のアタッチ失敗
ARMS の継続的プロファイリングは IBM OpenJ9 をサポートしていません。この JDK を使用すると、統合に失敗し、エラーが生成される可能性があります。代わりに OpenJDK または Oracle JDK を使用することを推奨します。
スパン内のコードホットスポットデータが不完全
コードホットスポットは、トレース内のスレッドのメソッドスタックを一定間隔でサンプリングすることによって特定されます。コードホットスポットのフレームグラフからメソッドが欠落している場合、その実行時間が 500 ミリ秒未満であることが原因である可能性があります。このような短い実行時間のメソッドは、サンプリングプロセスでキャプチャされないことがあります。短時間で実行されるメソッドはパフォーマンスボトルネックとは見なされないため、これは低速トレースの診断には影響しません。
フレームグラフに .GC_active スタックが含まれる理由
.GC_active は、フレームグラフのデータ収集中にガベージコレクション (GC) がアクティブであったことを示します。GC プロセスは、「Stop-the-World」として知られるイベントですべての Java ビジネススレッドを一時停止しました。.GC_active がコードホットスポットに表示される場合、GC の一時停止がリクエストのレイテンシの一因となったことを意味します。
フレームグラフに "unknown" エントリが含まれる理由
Alpine オペレーティングシステム上で、JDK にデバッグシンボルがなく、クラスローダーが多くのメソッドをロードする場合、継続的プロファイリングを有効にすると、アプリケーションの速度が低下したり、タイムアウトしたりすることがあります。これを防ぐため、エージェントのバージョン 4.2.1 以降では、ロード時間を監視します。デフォルトのしきい値は 150 ミリ秒です。ロードがこの時間を超えると、エージェントは時間のかかるいくつかのステップを停止します。これにより、一部のメソッドシンボルが正しく解析されなくなり、"unknown" エントリが発生します。このしきい値を調整して、この問題を軽減できます。たとえば、環境変数 AP_JMID_TIME_LIMIT を 500 ミリ秒に設定します:export AP_JMID_TIME_LIMIT=500。
フレームグラフに .no_Java_frame エントリが含まれる理由
これは通常、Alpine ベースイメージを使用している場合に発生します。Alpine はイメージサイズを削減するために JDK のデバッグシンボルを削除します。これにより、システムは JDK 内の C++ スレッドのメソッドスタック内の関数名を識別できなくなります。これらのスタックは、.no_Java_frame として表示されます。これらのスタックは、主に VM スレッドや Just-In-Time (JIT) コンパイラスレッドなど、非 Java スレッド情報を表します。.no_Java_frame エントリの割合が低い場合は、無視できます。パフォーマンス分析には、他の Java メソッドスタックに焦点を当ててください。割合が高い場合は、ベースイメージに JDK のデバッグシンボルをインストールするか、Alpine 以外のベースイメージに切り替えてください。一部の JDK バージョンには対応するデバッグシンボルパッケージがなく、インストールできない場合があることに注意してください。
フレームグラフに「other」項目が表示される理由
問題
フレームグラフに「other」項目が表示されます。たとえば、プロファイリングタイプとして [Allocated Memory] を選択した分析結果では、メモリ割り当てランキングテーブルで [other] 項目 (6.41 MB) がオレンジ色でハイライト表示され、特定の Java メソッド (たとえば AbstractQueuedSynchronizer$ConditionObject.addConditionWaiter() 8.99 MB と java.util.Arrays.copyOfRange(char[], int, int) 8.90 MB) の間に配置されます。右側のフレームグラフには、対応する呼び出しスタック階層が表示されます。
原因
フレームグラフの「other」項目は正常です。フレームグラフはツリー構造を持っています。ノードが多すぎると、主要な情報を特定するのが困難になることがあります。ARMS は、重要度の低いノードを「other」カテゴリにまとめることで、グラフを簡素化し、重要な情報を強調表示します。
ログ出力:parse lib sigsegv handler installed
ARMS エージェントがこの情報ログメッセージを出力します。これは、継続的プロファイリングを有効にした後にのみ表示され、アプリケーションの実行時パフォーマンスには影響しません。ARMS は将来のバージョンでこのログ出力を無効にする予定です。
perf_event_open の制限による "No access to perf events" エラーの解決方法
問題
Async-Profiler は、CPU プロファイリングのために perf_event_open システムコールに依存しています。しかし、seccomp などの Linux カーネルのセキュリティポリシーにより、プロセスによる特定のシステムコールの使用がブロックされる場合があります。
エラーメッセージは次のとおりです:
[ERROR] Failed to execute 'start,jfr=0,event=cpu,interval=11ms,alloc=512k,file=/tmp/cpc-async-profiler-7729534006755968198.jfr'
[ERROR] Failed to start Continuous Profile Collector
java.lang.RuntimeException: java.lang.IllegalStateException: No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1'解決策
"No AllocTracer symbols found. Are JDK debug symbols installed?" エラーの解決方法
このエラー、またはデータの欠落は、Java プロセスが Alpine ベースイメージを使用するコンテナで実行されている場合に発生する可能性があります。Alpine ベースイメージは、サイズを削減するために JDK のデバッグシンボルを削除します。これにより、継続的プロファイリングが正しく機能しなくなります。この問題を解決するには、デバッグシンボルがないためにメモリホットスポットの収集に失敗する場合の解決策をご参照ください。
"perf_event mmap failed..." エラーの解決方法
問題
このエラーは通常、Java 仮想マシン (JVM) の標準出力に表示されます。継続的プロファイリングが CPU ホットスポットをサンプリングする際、ネイティブスタック (Linux カーネル、JVM、および C/C++) と Java スタックの両方を収集します。ネイティブスタックを収集するには、各 Java スレッドの perf_event ファイル記述子に対してメモリマップ (MMap) を実行する必要があります。Linux カーネルは、これらの MMap 操作の合計メモリを制限します。デフォルトの制限は 516 KB です。Java アプリケーションに多数のスレッドがある場合、この制限を超える可能性があります。これにより、Java の標準出力に perf_event mmap failed... という警告がトリガーされます。この警告は、Java アプリケーションやビジネスロジックには影響しません。唯一の副作用は、フレームグラフにネイティブスタックが表示されなくなることです。通常、CPU ホットスポットの診断には Java メソッドスタックで十分であるため、この警告は無視できます。
解決策
このエラーメッセージを解消するには、次の手順を実行してください:
ホストマシンで、次のコマンドを実行してください。
echo 1028 > /proc/sys/kernel/perf_event_mlock_kbデフォルトのしきい値は 516 です。警告が止まるまでこの値を増やすことができます。値は、N を自然数として、数式
8*N + 4に従う必要があります。たとえば、516 = 512 + 4、1028 = 1024 + 4 です。エラーを解決するには、Docker を再起動してください。
関連操作
お使いの環境の JDK にデバッグシンボルが含まれているかどうかの確認
デバッグシンボルがないと、メモリホットスポットのアクティベーションに失敗します。その結果、メモリホットスポットのデータは収集できません。
エージェントログでデバッグシンボルが欠落しているかを確認してください。
エージェントのインストールディレクトリで、logs ディレクトリに cpc.log ファイルがあるか確認してください。一部の古いバージョンのエージェントでは、このファイルは logs/arms_log ディレクトリにあります。ログにキーワード
No AllocTracer symbols found. Are JDK debug symbols installed?が含まれている場合、デバッグシンボルが欠落していることを意味します。2023-03-08 11:32:00 [continuous Profile collector] [INFO] Some or all engines success, details below CPU:true Alloc:false:No AllocTracer symbols found. Are JDK debug symbols installed? Wall:true Other:false Lock:falseコマンドを使用して、環境にデバッグシンボルが欠落しているかどうかを確認してください。
JDK のインストールパスに移動してください。
環境内の JDK インストールパスは、
which javaコマンドまたはecho $JAVA_HOMEを使用して見つけることができます。JDK インストールパスのトップレベルから、次のコマンドを実行して libjvm.so ファイルへのパスを見つけてください。
find ./ -name "*libjvm.so*"次のコマンドを実行して、ファイルからデバッグシンボルが削除 (strip) されているかどうかを確認してください。
/path/to/を実際のパスに置き換えてください。file /path/to/libjvm.soコマンドが
not strippedを返した場合は、お使いの環境の JDK にはデバッグシンボルが含まれています。strippedを返した場合は、デバッグシンボルは含まれていません。[root@iZj6cbirlzrhmgljxdfxw9Z jdk-directory]# cd jdk8u412-b08 [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# ls ASSEMBLY_EXCEPTION LICENSE NOTICE THIRD_PARTY_README bin include jre lib man release sample src.zip [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# find ./ -name "*libjvm.so*" ./jre/lib/amd64/server/libjvm.so [root@iZj6cbirlzrhmgljxdfxw9Z jdk8u412-b08]# file ./jre/lib/amd64/server/libjvm.so ./jre/lib/amd64/server/libjvm.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped
デバッグシンボルがないためにメモリホットスポットの収集に失敗する場合の解決策
方法 1:JDK 11 以降へのアップグレード
JDK 11 以降の実装は調整されているため、デバッグシンボル情報に依存しなくなりました。
方法 2:ベースイメージの変更
Docker Hub にアクセスし、openjdk キーワードを使用して、eclipse-temurin、ibm-semeru-runtimes、amazoncorretto などの一般的な JDK ディストリビューションを見つけることができます。次に、Alpine Linux 上にビルドされていない JDK イメージを検索してください。独自の JDK イメージライブラリがある場合は、そこでも代替品を見つけることができます。Alpine Linux 上にビルドされた JDK イメージには、通常、タグに alpine が含まれています。
たとえば、eclipse-temurin:8u382-b05-jdk-alpine イメージは、タグに alpine が含まれており、Alpine Linux 上にビルドされていることを示します。このイメージの使用は避けてください。
Alpine Linux 以外のベースイメージ上にビルドされた JDK バージョンの例:
たとえば、Docker Hub の eclipse-temurin:8u392-b08-jdk イメージには、タグに alpine が含まれていません。これは、Alpine Linux 以外のベースイメージ上にビルドされた JDK バージョンであり、linux/amd64、linux/arm/v7、linux/arm64/v8、linux/ppc64le、windows/amd64 などの複数のアーキテクチャをサポートしています。
ベースイメージを変更してもデータがない場合は、ローカルの cpc.log ファイルで No AllocTracer symbols found. Are JDK debug symbols installed? エラーメッセージを確認してください。このメッセージは、お使いの環境にまだデバッグシンボルが欠落していることを示します。この場合は、別のベースイメージを使用するか、「方法 3:標準の Alpine Linux と JDK を使用する」をご参照ください。
方法 3:標準の Alpine Linux と JDK を使用する
ARMS エージェントのバージョン 3.2.8 以降を使用し、Dockerfile で Alpine Linux と JDK を宣言してください。
from Alpine:3.9
RUN apk add openjdk8