第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 ツールとは異なり、operfroot 権限なしに実行できます。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

例23.2 operf の基本的な使用状況

以下の例では、operf ツールを使用して、ls -l ~ コマンドからプロファイリングデータを収集します。

  1. ls コマンドのデバッグ情報をインストールします。

    # debuginfo-install -y coreutils
  2. プロファイリングの実行

    $ operf ls -l ~
    Profiling done.
  3. 収集したデータを分析します。

    $ 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 を使用して、シンボル毎にデータを出力します。

  1. この例で使用するデモの Java プログラムをインストールします。これは、java-1.8.0-openjdk-demo パッケージの一部で、Optional チャンネルに含まれます。Optionalチャンネルの使用方法については、「Enabling Supplementary and Optional Repositories」を参照してください。Optional チャンネルを有効にしたら以下のパッケージをインストールします。

    # yum install java-1.8.0-openjdk-demo
  2. OProfileoprofile-jit パッケージをインストールして、Java プログラムからプロファイルデータを収集できるようにします。

    # yum install oprofile-jit
  3. OProfile データのディレクトリーを作成します。

    $ mkdir ~/oprofile_data
  4. デモプログラムが含まれるディレクトリーに移動します。

    $ cd /usr/lib/jvm/java-1.8.0-openjdk/demo/applets/MoleculeViewer/
  5. プロファイリングを開始します。

    $ operf -d ~/oprofile_data appletviewer \
    -J"-agentpath:/usr/lib64/oprofile/libjvmti_oprofile.so" example2.html
  6. ホームディレクトリーに移動して、収集したデータを分析します。

    $ 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

23.2. OProfile のドキュメント

OProfile に関する詳細情報は、oprofile(1) man ページを参照してください。Red Hat Enterprise Linux には、OProfile に関する包括的なガイドが含まれており、このガイドは file:///usr/share/doc/oprofile-version/ にあります。

OProfile Manual
OProfile の詳細にわたる設定や用途の説明が含まれる包括的なマニュアルは、file:///usr/share/doc/oprofile-version/oprofile.html にあります。
OProfile Internals
OProfile の内部での機能に関する情報は、file:///usr/share/doc/oprofile-version/internals.html にあり、OProfile アップストリームへの貢献に興味のあるプログラマーには役立つ情報が含まれています。