このトピックでは、Application Real-Time Monitoring Service (ARMS) アプリケーションモニタリングの継続プロファイリング機能に関するよくある質問 (FAQ) への回答を提供します。
「parse lib sigsegv handler installed」ログが出力されるのはなぜですか?
原因
これらの不要なログは、継続プロファイリング機能が有効になっている場合にのみ、ARMS エージェントによって出力されます。これはアプリケーションの実行プロセスには影響しません。ARMS は、将来の新しいバージョンではこれらのログの出力を無効にします。
perf_event_open の制限により「No access to perf events」エラーが発生した場合はどうすればよいですか?
問題
Async-Profiler 構成の CPU プロファイラーは、perf_event_open システムコールを使用します。ただし、Linux カーネルは Secure Computing Mode (seccomp) を使用してシステムコール (syscall) を制限する場合があります。
エラーメッセージ:
[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'
解決策
Docker 環境: コンテナを実行するには、次のコマンドを実行します。きめ細かいシステムコール制御の設定方法の詳細については、Docker ドキュメントを参照してください。
docker run --security-opt seccomp=unconfined XXX
Kubernetes 環境:
privileged
パラメータを true に設定します。コンテナタイプは Unconfined のままにします。きめ細かいシステムコール制御の設定方法の詳細については、Kubernetes ドキュメントを参照してください。
「No AllocTracer symbols found .Are JDK debug symbols installed?」エラーが報告された場合はどうすればよいですか?
問題
Async-Profiler は、メモリをプロファイルするために Java Development Kit (JDK) のデバッグシンボルに依存しています。JDK にシンボルが存在しない場合、次のエラーメッセージが表示されることがあります。
[ERROR] Failed to start Continuous Profile Collector
java.lang.RuntimeException: java.lang.IllegalStateException: No AllocTracer symbols found. Are JDK debug symbols installed?
解決策
Java プロセスがコンテナ環境で実行されている場合、Alpine ベースイメージが原因で上記のエラーが発生したり、データが使用できない場合があります。継続プロファイリング機能は、主に JDK のデバッグシンボルに依存しています。ただし、Alpine ベースイメージはメモリ使用量を制御するために JDK からデバッグシンボルを削除します。そのため、継続プロファイリング機能は期待どおりに使用できません。JDK のデバッグシンボルをインストールするか、Alpine ベースイメージを使用しないことをお勧めします。デバッグシンボルパッケージがないため、一部の JDK バージョンではデバッグシンボルをインストールできない場合があります。
アプリケーションが CentOS 物理マシンにデプロイされている場合は、次の手順を実行してデバッグシンボルをインストールします。
次のコマンドを実行して、debuginfo ソースが構成されているかどうかを確認します。
yum repolist all | grep -i debug
次のソース構成情報が返されるかどうかを確認します。
debuginfo/7/x86_64 CentOS-7 - debuginfo - mirrors.aliyun.com Enable: 8,760
debuginfo 構成を Yum 構成ファイルに追加します。
vi /etc/yum.repos.d/CentOS-Base.repo [debuginfo] name=CentOS-$releasever - debuginfo - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-debuginfo/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Debug-7
ファイルを保存し、次のコマンドを実行します。
yum clean all yum makecache yum-config-manager --enable debuginfo
JDK のバージョンに基づいてデバッグシンボルをインストールします。
JDK 8
yum list installed|grep openjdk // JDK バージョンをクエリします。 java-1.8.0-openjdk.x86_64 1:1.8.0.332.b09-1.el7_9 @updates debuginfo-install -y java-1.8.0-openjdk // デバッグシンボルをインストールします。
JDK 11
yum list installed|grep openjdk // JDK バージョンをクエリします。 java-11-openjdk.x86_64 1:11.0.15.0.9-2.el7_9 @updates debuginfo-install -y java-11-openjdk // デバッグシンボルをインストールします。
JDK のデバッグシンボルがインストールされているかどうかを確認します。
gdb $JAVA_HOME/lib/server/libjvm.so -ex 'info address UseG1GC' gdb /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre/lib/amd64/server/libjvm.so -ex 'info address UseG1GC' GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre/lib/amd64/server/libjvm.so...Reading symbols from /usr/lib/debug/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre/lib/amd64/server/libjvm.so.debug...done. done.
インストールが成功した場合、次の情報が返されます。
Symbol "UseG1GC" is static storage at address 0x107f993.
インストールに失敗した場合、次の情報が返されます。
No symbol "UseG1GC" in current context.
「perf_event mmap failed...」エラーが報告された場合はどうすればよいですか?
問題
通常、このエラーは JVM の標準出力 (stdout) に表示されます。継続プロファイリング機能が CPU ホットスポットサンプリングを実行すると、ネイティブスタック (Linux カーネル、JVM、C、および C++) と Java スタックが同時に収集されます。ネイティブスタックを収集するには、Java の各スレッドの perf_event FD で mmap を実行する必要があります。Linux カーネルは、perf_event プロセスに関連する mmap の合計メモリサイズを 516 KB に制限しています。多数のスレッドが存在する場合、アラートメッセージ perf_event mmap failed...
が Java stdout に出力されます。このエラーは、Java スタックやサービスではなく、フレームグラフに表示されないネイティブスタックに影響します。通常、CPU ホットスポットを特定する場合、Java メソッドスタックにのみ注意を払い、アラートは無視します。
解決策
このエラーを解決するには、次の手順を実行します。
ホストで次のコマンドを実行します。
echo 1028 > /proc/sys/kernel/perf_event_mlock_kb
デフォルトのしきい値は 516 で、アラートがトリガーされなくなるまで徐々に増やすことができます。値は次の式に基づいて指定することをお勧めします。
8*N + 4
。ここで、N は自然数です。サンプル値: 516 (512 + 4) および 1028 (1024 + 4)。エラーを修正するには、Docker を再起動します。
フレームグラフに「other」項目が表示されるのはなぜですか?
問題
次の図に示すように、フレームグラフに「other」項目が表示されます。
原因
フレームグラフの「other」項目は正常です。フレームグラフが多数のノードで構成されている場合、重要な情報を抽出するのが困難です。ARMS はノードを収束させ、重要でないノードを「other」カテゴリに配置します。
フレームグラフに no_Java_frame 項目が表示されるのはなぜですか?
これは、Alpine ベースイメージがメモリ使用量を制御するために JDK からデバッグシンボルを削除するためです。VM スレッドや JIT コンパイルスレッドなどの C++ スレッドのメソッドスタックは関数名を認識できず、代わりに no_Java_frame を表示します。これらのスタックの割合が低い場合は、問題を無視できます。それ以外の場合は、JDK のデバッグシンボルをインストールするか、Alpine ベースイメージを使用しないことをお勧めします。デバッグシンボルパッケージがないため、一部の JDK バージョンではデバッグシンボルをインストールできない場合があります。