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

Application Real-Time Monitoring Service:よくある質問

最終更新日:May 23, 2025

このトピックでは、Application Real-Time Monitoring Service (ARMS) の継続プロファイリング機能に関するよくある質問 (FAQ) への回答を提供します。

継続プロファイリングを有効にした後、ページにデータが表示されないのはなぜですか?

  1. 関連する構成が正しいかどうか、および 構成済みのネットワークセグメント にアプリケーションインスタンスの IP アドレスが含まれているかどうかを確認します。

  2. V3.1.4 より前の ARMS エージェントを使用している場合、Alpine ベースイメージとの互換性の問題により、プロファイリングエンジンが失敗する可能性があります (この問題はバージョン 3.1.4 で修正されています)。機能の安定性とデータの整合性を確保するために、エージェントを V3.1.4 以降に アップグレード することをお勧めします。

    説明

    Alpine Linux ベースイメージを使用しているかどうかを確認する方法については、その他 をご参照ください。

  3. 継続プロファイリングは、オープンソースの Async Profiler を強化することでデータを収集します。現在、複数の Async Profiler を同時にマウントすることはサポートされていません。アプリケーションが Pyroscope エージェントによって提供される継続プロファイリング機能も使用している場合、起動に失敗する可能性があります。

  4. [アプリケーション診断] > [アプリケーション診断] > [継続的プロファイリング] ページのクエリ時間を 8 時間前に調整し、データが存在するかどうかを確認します。データが存在する場合、アプリケーションのタイムゾーンが UTC+0 に設定されているため、データの書き込み時間が UTC+8 より 8 時間遅れている可能性があります。

    解決策: アプリケーションに環境変数を追加して、タイムゾーンを UTC+8 に調整します。

    説明

    過去 8 時間にコンテナが過度に再起動されたことによる混乱を避けるため、最初に [アプリケーション診断] > [アプリケーション診断] > [継続的プロファイリング] ページで現在のポッド名でフィルタリングすることをお勧めします。

    Key: JAVA_TOOL_OPTIONS, Value: -Duser.timezone=GMT+8 // キー: JAVA_TOOL_OPTIONS、値: -Duser.timezone=GMT+8

    この問題は ARMS エージェント V4.1.10 で修正されています。これが問題であることを確認した場合は、エージェントを V4.1.10 以降に アップグレード することもできます。

  5. アプリケーション自体が他の Async Profiler 動的ライブラリをマウントしているかどうかを、次のように確認します。

    1. 次のコマンドを実行します。[pid] をアプリケーションのプロセス ID に置き換えます。

      lsof -p [pid] | grep libasync // lsof -p [pid] | grep libasync
    2. 結果に、次のような Alibaba Cloud 以外の動的ライブラリが含まれている場合、アプリケーション自体が Async Profiler 動的ライブラリを使用しているため、ARMS との非互換性が発生します。この場合、ARMS 機能を引き続き使用する前に、動的ライブラリを削除する必要があります。

      /home/admin/xxx/.default/temp/libasyncProfiler1309163652530490111.so // /home/admin/xxx/.default/temp/libasyncProfiler1309163652530490111.so

ヒープメモリモニタリングに表示されるメモリ使用率と、継続プロファイリングで特定の期間中に検出されたメモリ使用率が異なります。これは正常ですか?

継続プロファイリングは、指定された期間中のヒープメモリの割り当てのみを記録し、現在のプロセスに実際に含まれるメモリの総量を記録するわけではありません。したがって、これら 2 つのデータセット間に違いがあるのは正常です。

CPU 診断にはデータが表示されるのに、メモリ診断にはデータが表示されないのはなぜですか?

問題

メモリ診断データがない問題は、通常、Alpine ベースイメージを使用するコンテナ環境で V3.1.4 以降の ARMS エージェントで発生します。 Alpine はイメージサイズを小さくするために JDK デバッグシンボルを取り除くため、継続プロファイリング機能が無効になります。

解決策

  1. 環境内の JDK にデバッグシンボルが含まれているかどうかを確認します

  2. 含まれていない場合は、イメージ内の JDK にデバッグシンボルをインストールするか (デバッグシンボルパッケージがない一部の JDK バージョンではインストールに失敗する可能性があります)、Alpine 以外のベースイメージを使用します。

コードホットスポットのデータがないのはなぜですか? コードホットスポットデータが期待どおりでないのはなぜですか?

  1. JDK (Alibaba Dragonwell JDK を含む) で仮想スレッドまたは同様のテクノロジーを使用するアプリケーションでは、メモリホットスポット分析は使用できません。

  2. 現在、コードホットスポット機能は SkyWalking プロトコルではサポートされていません。トレースのスパンの詳細でプロトコルタイプを確認してください。

  3. コードホットスポット機能には、V3.1.4 以降の ARMS エージェントが必要です。

  4. V4.2.1 より前の ARMS エージェントは同期呼び出しのみをサポートしており、データ収集が不完全になる場合があります。非同期呼び出しを行うと、データが欠落したり不正確になったりする可能性があります。たとえば、Spring Cloud Gateway、Undertow、Lettuce などのフレームワークを使用する場合、非同期スレッドの切り替えにより、データ収集が不正確になる可能性があります。エージェント V4.2.1 以降では、これらの問題を解決するために最適化されています。最適なパフォーマンスを得るには、エージェントを更新 してください。

  5. コードホットスポットは、固定サンプリングレートでサンプリングされたトレースでのみサポートされます。固定されていないサンプリングレートを使用してトレースを収集すると、トレースの完了後にトリガーされる誤サンプリング (s9) や低速サンプリング (s10) など、パフォーマンスのオーバーヘッドが大幅に増加する可能性があります (スパン属性の sample.reason フィールドを確認できます)。固定されていないサンプリングレートを使用して収集されたトレースは、現在、コードホットスポットをサポートしていません。

    固定されていないサンプリングレートで収集されたトレースの場合、ホットスポット コードを含むトレースプラグインのドキュメントを確認します。 ページの パラメーターを使用して、コードホットスポットを含むトレースをフィルタリングして問題診断を行うことをお勧めします。

    image

  6. エージェント V4.2.1 以降を使用しているにもかかわらず、収集された期間が外部スパンによって記録された期間よりも大幅に短い場合、アプリケーションが非同期、非ブロッキング NIO フレームワーク (例: Spring Cloud Gateway) を使用している可能性があります。このようなフレームワークは、ダウンストリームサービスにリクエストを送信するときに、ダウンストリームデータの準備ができていない場合、スレッドをブロックしません。代わりに、すぐに復帰してスレッドが他のタスクを実行できるようにすることで、スレッドの利用率を向上させます。このシナリオでは実際のスレッド実行が発生しないため、パフォーマンスのボトルネックは現在のアプリケーション内にはない可能性があります。このような場合、コードホットスポットの収集期間はスパン期間よりもはるかに短くなる可能性があります。ダウンストリームアプリケーションのリクエスト処理またはネットワークレイテンシにボトルネックがないかどうかを重点的に調査する必要があります。

継続プロファイリングのパフォーマンスオーバーヘッドはどのくらいですか?

  • 継続プロファイリングはテスト済みであり、一般的な Spring Web アプリケーションですべての機能を有効にした 500 TPS のシナリオでは、CPU オーバーヘッドは約 5% 増加し、オフヒープメモリ使用量は約 50 MB 増加しますが、GC とリクエストレイテンシは大幅に増加しません。

  • 極端な場合、メモリホットスポット分析は現在スロットリングを実装していないため、アプリケーションが頻繁にメモリを割り当てると、関連するイベントが大量に生成される可能性があり (1 分あたり数万など)、P99 レイテンシに影響を与える可能性があります。この問題を解決するには、メモリプロファイリングを一時的に無効にすることができます。

    この問題は V4.1.10 で修正されています。エージェントを V4.1.10 以降に アップグレード できます。

アプリケーションに JFR 関連のスレッドがあるのはなぜですか?

  • 継続プロファイリング機能は JFR スレッドを生成します。これらのスレッドは主に ARMS エージェント V4.1.10 に存在し、V4.1.10 以降では積極的に導入されなくなります。

  • これらのスレッドは、アプリケーションのパフォーマンスボトルネックを引き起こしません。

  • 継続プロファイリングを動的に無効にした後、スレッドはすぐに破棄されず、アプリケーションの再起動後にのみ消えます。

継続プロファイリングがアプリケーションの起動時間に影響を与える場合はどうすればよいですか?

継続プロファイリングを有効にするアプリケーションの場合、JDK にデバッグシンボルがなく、クラスローダーが多くのメソッドをロードする場合、起動速度が大幅に低下する可能性があります。ただし、起動が完了すると、ランタイムパフォーマンスへの影響はありません。

この問題は V4.2.1 で修正されており、アプリケーションの起動には影響しません。エージェントを V4.2.1 以降に アップグレード できます。

フレームグラフの合計メモリが実際に構成されているメモリ制限を超えているのはなぜですか?

継続プロファイリングに表示されるデータは、マシンの構成に直接関連付けられていません。データは、分析された期間中に割り当てられたヒープメモリのサイズを表します。ガベージコレクションのため、表示されるメモリがマシンの実際に構成されているメモリを超えることが予想されます。

OpenJ9 JDK の統合に失敗した場合はどうすればよいですか?

継続プロファイリングは現在、Eclipse OpenJ9 (以前は IBM J9 として知られていました) をサポートしていません。この JDK は統合に失敗し、エラーが報告される可能性があります。OpenJDK または Oracle JDK を使用することをお勧めします。

スパンのコードホットスポットデータが不完全な場合はどうすればよいですか?

コードホットスポットは、トレース内のスレッドのメソッドスタックを定期的にサンプリングすることによって収集されます。コードホットスポットフレームグラフにメソッドがない場合は、実行時間が 500 ミリ秒未満かどうかを確認してください。500 ミリ秒未満の場合、キャプチャされていない可能性があります。実行時間の短いメソッドはパフォーマンスのボトルネックになる可能性が低いため、これは関連する低速トレースの診断には影響しません。

フレームグラフに .GC_active スタックが含まれているのはなぜですか?

.GC_active は、フレームグラフデータの収集中に、アプリケーションがガベージコレクションの Stop-the-World プロセス (すべての Java ビジネススレッドが一時停止される) の影響を受けたことを示します。これにより、関連するビジネススレッドが中断されます。.GC_active がコードホットスポットに表示される場合、リクエストレイテンシの一部が GC の一時停止によって引き起こされたことを意味します。

フレームグラフに .no_Java_frame エントリが含まれているのはなぜですか?

これは一般に、Alpine ベースイメージの使用が原因です。イメージサイズを小さくするために、Alpine は JDK デバッグシンボルを削除するため、JDK 内の C++ スレッドメソッドスタックの関数名を認識できません。その結果、これらのスタックは .no_Java_frame として表示されます。これらのスタックは主に Java 以外のスレッド実行情報 (VM スレッドや JIT コンパイラスレッドなど) を表しているため、その割合が低い場合は無視して、他の Java メソッドスタックに焦点を当ててパフォーマンス分析を行うことができます。.no_Java_frame エントリの割合が高い場合は、ベースイメージの JDK にデバッグシンボルをインストールするか、Alpine 以外のベースイメージに切り替えることを検討してください。一部の JDK バージョンには対応するデバッグシンボルパッケージがないため、インストールできない場合があります。

フレームグラフに「その他」の項目が表示されるのはなぜですか?

問題

次の図に示すように、フレームグラフに「その他」の項目が表示されます。

火焰图other选项

原因

フレームグラフに「その他」の項目が表示されるのは正常です。フレームグラフは本質的にツリー構造です。ノードが多い場合、グラフから重要な情報を抽出することが難しくなります。したがって、ARMS は重要度の低いノードを「その他」カテゴリに統合して、視覚化を簡素化し、重要な情報を強調表示します。

ログ出力「parse lib sigsegv handler installed」は、実行時にアプリケーションに影響しますか?

このログメッセージは ARMS エージェントによって出力され、不要なログと見なされます。継続プロファイリングを有効にした後にのみ表示され、実行時のアプリケーションには影響しません。また、ARMS は今後のバージョンでこのログ出力を無効にする予定です。

perf_event_open の制限によって発生する「No access to perf events」エラーを解決するにはどうすればよいですか?

問題

async-profiler は、CPU プロファイリングに perf_event_open システムコールに依存しています。ただし、Linux カーネルのシステムコール権限を制御するセキュリティポリシー (例: seccomp) により、特定のシステムコールが禁止される場合があります。エラーメッセージには、perf イベントにアクセスできないことが示されます。

エラーメッセージ:

[ERROR] Failed to execute 'start,jfr=0,event=cpu,interval=11ms,alloc=512k,file=/tmp/cpc-async-profiler-7729534006755968198.jfr' // [エラー] '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' // java.lang.RuntimeException: java.lang.IllegalStateException: perf イベントにアクセスできません。 --fdtransfer または --all-user オプション、または 'sysctl kernel.perf_event_paranoid=1' を試してください

解決策

  • Docker 環境: 次のコマンドを実行してコンテナを実行します。よりきめ細かいシステムコール制御構成については、Docker のドキュメント をご参照ください。

      docker run --security-opt seccomp=unconfined  XXX // docker run --security-opt seccomp=unconfined XXX
  • Kubernetes 環境: 特権コンテナパラメータ privileged: true // privileged: true を構成します。特権コンテナは 制限なし のままです。

    よりきめ細かいシステムコール制御構成については、Kubernetes のドキュメント をご参照ください。

No AllocTracer symbols found. Are JDK debug symbols installed?」エラーを解決するにはどうすればよいですか?

このエラーまたはプロファイリングデータの欠落は、Alpine ベースイメージを使用する場合に、コンテナ環境で実行されている Java プロセスで発生する可能性があります。このようなイメージは、イメージサイズを小さくするために JDK デバッグシンボルを取り除くため、継続プロファイリング機能が低下します。この場合、必要に応じて JDK のアップグレード、ベースイメージの変更、または標準の Alpine Linux と JDK の使用 を行ってください。

「perf_event mmap failed...」エラーを解決するにはどうすればよいですか?

問題

このエラーは通常、JVM の標準出力に表示されます。継続プロファイリング機能が CPU ホットスポットサンプルを収集するときに、ネイティブスタック (Linux カーネル + JVM + C/C++) と Java スタックの両方を同時に収集します。ネイティブスタックを収集するには、Java の各スレッドの perf_event ファイル記述子で MMap を実行する必要があります。Linux カーネルは、perf_event に関連する MMap 操作の合計メモリサイズに制限を設けています (デフォルトのしきい値: 516 KB)。Java にスレッドが多い場合、この制限を超えると、Java の標準出力に警告メッセージ perf_event mmap failed... がトリガーされます。この警告は、Java またはビジネスロジックの動作に副作用はありません。実際の影響は、ネイティブスタックがフレームグラフに表示されないことです。一般に、CPU ホットスポットの問題を診断する場合、Java メソッドスタックのみを調べれば十分なので、この警告は無視しても問題ありません。

解決策

このエラーを解決するには、次の手順に従います。

  1. ホストで次のコマンドを実行します。

    echo 1028 > /proc/sys/kernel/perf_event_mlock_kb // echo 1028 > /proc/sys/kernel/perf_event_mlock_kb

    デフォルトのしきい値は 516 KB です。警告がなくなるまで、この値を徐々に増やすことができます。値は、式 8 × N + 4 を満たすように設定することをお勧めします。ここで、N は自然数です。例: 516 = 512 + 4、1028 = 1024 + 4。

  2. Docker を再起動してエラーを解決します。

その他

環境内の JDK にデバッグシンボルが含まれていることを確認するにはどうすればよいですか?

デバッグシンボルがないと、メモリホットスポットのアクティブ化とデータ収集ができません。ARMS エージェントが存在する環境内の JDK にデバッグシンボルが含まれているかどうかを確認するには、次のいずれかの方法を使用します。

エージェントログを表示する

エージェントの logs ディレクトリで cpc.log ファイル (または初期バージョンのエージェントの場合は logs/arms_log ファイル) を確認します。キーワード No AllocTracer symbols found. Are JDK debug symbols installed? // AllocTracer シンボルが見つかりません。JDK デバッグシンボルはインストールされていますか? は、シンボルがないことを示します。

image

コマンドを実行する

  1. which java // which java または echo $JAVA_HOME // echo $JAVA_HOME コマンドを実行して、JDK パスを見つけます。

  2. JDK ルートディレクトリから次のコマンドを実行して、libjvm.so ファイルパスを見つけます。

    find ./ -name "*libjvm.so*" // find ./ -name "*libjvm.so*"
  3. 次のコマンドを実行して、プラグインからデバッグシンボルが削除されているかどうかを確認します。/path/to/ // /path/to/libjvm.so ファイルを格納するパスに置き換えます。

    file /path/to/libjvm.so // file /path/to/libjvm.so

    not stripped // stripped されていません が返された場合、JDK にはデバッグシンボルが含まれています。

    image

デバッグシンボルがないことによるメモリホットスポット収集の失敗を解決するにはどうすればよいですか?

このような失敗を解決するには、次のいずれかの方法を使用します。

JDK を JDK 11 以降にアップグレードする

JDK 11 以降の実装では、アーキテクチャの最適化により、デバッグシンボルは不要になりました。

ベースイメージを変更する

Docker Hub にアクセスし、キーワード openjdk // openjdk を使用して一般的な JDK ディストリビューションを検索します (例: eclipse-temurinibm-semeru-runtimesamazoncorretto)。次に、Alpine Linux 上に構築されていない JDK イメージを探します。一般的に使用される JDK イメージの独自のリポジトリがある場合は、そこでイメージを使用することもできます。通常、Alpine Linux 上に構築された JDK イメージのタグには、alpine // alpine などのキーワードが含まれています。

image.png

Alpine 以外の Linux ベースイメージ上に構築された JDK バージョンの例:

image.png

ベースイメージを変更した後も問題が解決しない場合は、local cpc.log // ローカル cpc.log ファイルに No AllocTracer symbols found .Are JDK debug symbols installed? // AllocTracer シンボルが見つかりません。JDK デバッグシンボルはインストールされていますか? エラーが含まれているかどうかを確認します。これは、環境にデバッグシンボルがないことを示します。この場合は、他のベースイメージまたは 標準の Alpine Linux と JDK を使用します。

標準の Alpine Linux と JDK を使用する

V3.2.8 以降の ARMS エージェントを使用し、Dockerfile で Alpine Linux と JDK を宣言します。

from Alpine:3.9 // Alpine:3.9 から
RUN apk add openjdk8 // RUN apk add openjdk8