Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第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
注記

イベントは、プロセッサーの実装に固有です。perf_event_paranoid オプションを設定するか、カウントをユーザー空間イベントのみに制限する必要がある場合があります。

例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 チャンネル の使用方法は、Optional および Supplementary リポジトリーの追加 を参照してください。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