第23章 OProfile
OProfile は、oprofile パッケージで提供されるオーバーヘッドコストの少ない、システム全体のパフォーマンス監視ツールです。システムのプロセッサー上にあるパフォーマンス監視ハードウェアを使用して、メモリーの参照タイミング、第 2 レベルのキャッシュ要求の回数、受け取るハードウェア割り込みの回数など、システム上のカーネルと実行可能ファイルに関する情報を取得します。OProfile は、Java Virtual Machine (JVM) で実行されるアプリケーションのプロファイリングも実行できます。
以下は、OProfile が提供するツールの選択です。
- ophelp
- システムプロセッサーで使用可能なイベントと、各イベントの簡単な説明を表示します。
- operf
主なプロファイリングツール。
operf
ツールは、Linux Performance Event サブシステムを使用します。これにより、OProfile が、システムのパフォーマンス監視ハードウェアを使用するその他のツールと共に動作できるようになります。以前に使用していた
opcontrol
ツールとは異なり、初期設定は必要ありません。--system-wide
オプションが使用されている場合を除き、root 権限がなくても使用できます。
- ocount
- イベント発生の絶対数をカウントするためのツール。これは、プロセスごと、CPU ごと、またはスレッドごとに、システム全体のイベントをカウントできます。
- opimport
- サンプルデータベースファイルをシステム用に外部のバイナリー形式からネイティブの形式に変換します。異なるアーキテクチャーからのサンプルデータベースを解析する場合にのみこのオプションを使用してください。
- opannotate
- アプリケーションがデバッグシンボルでコンパイルされている場合は、実行可能ファイル用のアノテーション付きのソースを作成します。
- opreport
- 記録されたパフォーマンスデータを読み取り、プロファイル仕様で指定したサマリーを生成します。異なるプロファイル仕様を使用して、同じプロファイルデータから異なるレポートを生成できます。
23.1. OProfile の使用
operf
はプロファイリングデータを収集するための推奨されるツールです。このツールには初期設定の必要がなく、すべてのオプションはコマンドラインで渡されます。レガシーの opcontrol
ツールとは異なり、operf
は root
権限なしに実行できます。operf
ツールの使用方法に関する詳細は、システム管理者ガイドの operf の使用 の章をを参照してください。
例23.1 ocount の使用
以下の例は、sleep
ユーティリティーの実行時に、ocount
を使用したイベント量のカウントを示しています。
$ ocount -e INST_RETIRED -- sleep 1 Events were actively counted for 1.0 seconds. Event counts (actual) for /bin/sleep: Event Count % time counted INST_RETIRED 683,011 100.00
イベントは、プロセッサーの実装に固有です。perf_event_paranoid
オプションを設定するか、カウントをユーザー空間イベントのみに制限する必要がある場合があります。
例23.2 operf の基本的な使用方法
以下の例では、operf
ツールを使用して、ls -l ~
コマンドからプロファイリングデータを収集します。
ls
コマンドのデバッグ情報をインストールします。# debuginfo-install -y coreutils
プロファイリングを実行します。
$ operf ls -l ~ Profiling done.
収集したデータを分析します。
$ opreport --symbols CPU: Intel Skylake microarchitecture, speed 3.4e+06 MHz (estimated) Counted cpu_clk_unhalted events () with a unit mask of 0x00 (Core cycles when at least one thread on the physical core is not in halt state) count 100000 samples % image name symbol name 161 81.3131 no-vmlinux /no-vmlinux 3 1.5152 libc-2.17.so get_next_seq 3 1.5152 libc-2.17.so strcoll_l 2 1.0101 ld-2.17.so _dl_fixup 2 1.0101 ld-2.17.so _dl_lookup_symbol_x [...]
例23.3 Java プログラムのプロファイリングでの operf の使用
以下の例では、operf
ツールを使用して Java (JIT) プログラムからプロファイリングデータを収集し、次に opreport
を使用して、シンボルごとのデータを出力します。
この例で使用するデモ用の Java プログラムをインストールします。これは java-1.8.0-openjdk-demo パッケージの一部であり、Optional チャンネルに含まれます。Optional チャンネル の使用方法は、Optional および Supplementary リポジトリーの追加 を参照してください。Optional チャンネルを有効にしたら以下のパッケージをインストールします。
# yum install java-1.8.0-openjdk-demo
OProfile の oprofile-jit パッケージをインストールして、Java プログラムからプロファイリングデータを収集できるようにします。
# yum install oprofile-jit
OProfile データのディレクトリーを作成します。
$ mkdir ~/oprofile_data
デモプログラムが含まれるディレクトリーに移動します。
$
cd /usr/lib/jvm/java-1.8.0-openjdk/demo/applets/MoleculeViewer/
プロファイリングを開始します。
$ operf -d ~/oprofile_data appletviewer \ -J"-agentpath:/usr/lib64/oprofile/libjvmti_oprofile.so" example2.html
ホームディレクトリーに移動して、収集したデータを分析します。
$
cd
$
opreport --symbols --threshold 0.5
出力例は以下のとおりです。
$ opreport --symbols --threshold 0.5 Using /home/rkratky/oprofile_data/samples/ for samples directory. CPU: Intel Ivy Bridge microarchitecture, speed 3600 MHz (estimated) Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000 samples % image name symbol name 14270 57.1257 libjvm.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.51-1.b16.el7_1.x86_64/jre/lib/amd64/server/libjvm.so 3537 14.1593 23719.jo Interpreter 690 2.7622 libc-2.17.so fgetc 581 2.3259 libX11.so.6.3.0 /usr/lib64/libX11.so.6.3.0 364 1.4572 libpthread-2.17.so pthread_getspecific 130 0.5204 libfreetype.so.6.10.0 /usr/lib64/libfreetype.so.6.10.0 128 0.5124 libc-2.17.so __memset_sse2