第8章 OProfile—システム全体に対するプロファイラ

目次

8.1. 考え方の概要
8.2. インストールと要件
8.3. 利用可能な OProfile ユーティリティ
8.4. OProfile の使用
8.5. OProfile GUI の使用
8.6. レポートの作成
8.7. さらなる情報

概要

OProfile は動的なプログラム分析を行なうためのプロファイラです。実行中の プログラムに対してその動作を調査し、情報を収集することができます。収集した 情報は、さらなる最適化を行なうためのヒントとして閲覧することができます。

OProfile を使用するにあたっては、ラッパーライブラリを使用するように修正 したり、コンパイルし直したりする必要はありません。カーネルに対する修正も 不要です。アプリケーションをプロファイルする場合、プロファイル作業の負荷と 採取間隔にもよりますが、通常の使用範囲であれば、ごく少量のオーバーヘッドが あるだけです。

8.1. 考え方の概要

OProfile は、カーネルドライバとデータを収集するためのデーモンから構成されて います。また、 Intel, AMD などのプロセッサが提供する、パフォーマンス カウンタと呼ばれるハードウエアを使用して行ないます。 OProfile はカーネルや カーネルモジュール、カーネルの割り込みハンドラやシステムの共有ライブラリ、 その他のアプリケーションなど、すべてのコードをプロファイルすることができます。

新しいプロセッサであれば、パフォーマンスカウンタとしてハードウエア経由の プロファイルを行なうことができます。プロセッサの種類にもよりますが、多くの カウンタが用意されていて、それぞれカウント対象のイベントをプログラムする ことができます。またそれぞれのカウンタでは、サンプルを採取する頻度を設定する ことができます。小さい値ほどより頻繁に採取する意味になります。

最後に事後の処理では、すべての情報を収集したあと命令アドレスを各関数名に 置き換える作業を行ないます。

8.2. インストールと要件

OProfile を使用するには oprofile パッケージをインストールします。 OProfile はそれぞれ IA-64, AMD64, s390, PPC64 の各プロセッサ上で動作します。

なお、プロファイル対象のアプリケーションに対して提供されている、 *-debuginfo パッケージをインストールしておくことを お勧めします。カーネルをプロファイルしたい場合も同様に、 debuginfo パッケージをインストールしてください。

8.3. 利用可能な OProfile ユーティリティ

OProfile は複数のユーティリティから構成され、それぞれプロセスのプロファイル 処理を行なうものと、そのプロファイルデータを処理するものに分かれています。 下記では、本章内で使用する各プログラムについて、概要を説明しています:

opannotate

ソースコードやアセンブリに対して注釈を設定し、プロファイル情報に埋め込む コマンドです。

opcontrol

プロファイルセッションを制御 (開始や停止) したり、プロファイルデータを ダンプしたり、パラメータを設定したりします。

ophelp

利用可能なイベントの一覧と、それらに対する簡単な説明を表示します。

opimport

サンプルのデータベースファイルを、対外的なバイナリ形式から ネイティブな形式に変換します。

opreport

プロファイルデータからレポートを生成します。

8.4. OProfile の使用

OProfile はカーネルとアプリケーションの両方をプロファイルできます。カーネルを プロファイルする場合は、 OProfile に対して vmlinuz* の場所を指定します。 --vmlinux オプションを指定して、 vmlinuz* の場所 (通常であれば /boot 内) を指定してください。カーネルモジュールをプロファイルする必要がある場合は、 OProfile に対して特に何も指定する必要はありません。ただし、あらかじめ http://oprofile.sourceforge.net/doc/kernel-profiling.html (英語) を読んでおいてください。

アプリケーションをプロファイルする場合、通常はカーネルをプロファイルする必要は ありませんので、 --no-vmlinux オプションを指定して情報量を 減らしておくことをお勧めします。

8.4.1. 一般的な手順

もっともシンプルな方法でプロファイルを行なう場合は、まずデーモンを起動して データを収集し、デーモンを停止してレポートを作成する、という流れになります。 この方法をより詳しく書くと、下記のようになります:

  1. シェルを起動して root でログインします。

  2. Linux カーネルを利用してプロファイルするか、もしくは利用せずにプロファイル するかを決めます:

    1. Linux カーネルを利用するプロファイル.  下記のコマンドを実行します。これは opcontrol コマンドが非圧縮のイメージファイルを利用するためです:

      cp /boot/vmlinux-`uname -r`.gz /tmp
      gunzip /tmp/vmlinux*.gz
      opcontrol --vmlinux=/tmp/vmlinux*
      
    2. Linux カーネルを利用しないプロファイル.  下記のコマンドを実行します:

      opcontrol --no-vmlinux

      ある関数から別の関数を呼び出す様子を出力に含めたい場合は、 --callgraph オプションと最大の呼び出し履歴数 (DEPTH) を追加で指定します:

      opcontrol --no-vmlinux --callgraph DEPTH
  3. OProfile デーモンを起動します:

    opcontrol --start
    Using 2.6+ OProfile kernel interface.
    Using log file /var/lib/oprofile/samples/oprofiled.log
    Daemon started.
    Profiler running.
  4. 前項の作業が完了したら、プロファイル対象のアプリケーションを起動します。

  5. OProfile デーモンを停止します:

    opcontrol --stop
  6. 収集したデータを /var/lib/oprofile/samples 以下に出力します:

    opcontrol --dump
  7. レポートを作成します:

    opreport
    Overflow stats not available
    CPU: CPU with timer interrupt, speed 0 MHz (estimated)
    Profiling through timer interrupt
              TIMER:0|
      samples|      %|
    ------------------
        84877 98.3226 no-vmlinux
    ...
  8. OProfile デーモンをシャットダウンします:

    opcontrol --shutdown

8.4.2. イベント設定の取得

イベントの設定を行なうための一般的な手順は下記の通りです:

  1. 最適化のヒントを得るには、まず CPU-CLK_UNHALTEDINST_RETIRED のイベントを指定して使用します。

  2. ボトルネックを検出するため、特定のイベントを指定して使用します。 イベントの一覧を表示するには、 opcontrol --list-events を実行してください。

特定のイベントに対してプロファイルを行ないたい場合は、まず ophelp コマンドを利用して、お使いのプロセッサが そのイベントに対応しているかどうかを確認してください (下記は Intel Core i5 CPU での出力例です):

ophelp 
oprofile: available events for CPU type "Intel Architectural Perfmon"

See Intel 64 and IA-32 Architectures Software Developer's Manual
Volume 3B (Document 253669) Chapter 18 for architectural perfmon events
This is a limited set of fallback events because oprofile doesn't know your CPU
CPU_CLK_UNHALTED: (counter: all))
        Clock cycles when not halted (min count: 6000) 
INST_RETIRED: (counter: all))
        number of instructions retired (min count: 6000) 
LLC_MISSES: (counter: all))
        Last level cache demand requests from this core that missed the LLC (min count: 6000) 
        Unit masks (default 0x41)
        ----------
        0x41: No unit mask 
LLC_REFS: (counter: all))
        Last level cache demand requests from this core (min count: 6000) 
        Unit masks (default 0x4f)
        ----------
        0x4f: No unit mask 
BR_MISS_PRED_RETIRED: (counter: all))
        number of mispredicted branches retired (precise) (min count: 500)

なお、 opcontrol--list-events コマンド でも同じ出力を得ることができます。

上記で対応していることを確認したら、 --event オプションで イベントを指定して実行します。なお、複数のオプションを指定することもできます。 また、このオプションではイベント名 (ophelp での出力) と 採取間隔 (サンプルレート) を指定します。たとえば下記のようになります:

opcontrol --event=CPU_CLK_UNHALTED:100000
[Warning]CPU_CLK_UNHALTED の採取間隔によってもたらされる負荷について

短い時間間隔でサンプリングを行なうと、システムに高い負荷をかけることに なってしまうほか、場合によってはフリーズしてしまうことがあります。

8.5. OProfile GUI の使用

OProfile 向けの GUI は、 root から oprof_start コマンドで起動することができます (図8.1「OProfile 向け GUI」 のように表示されます) 。あとは採取したいイベントを選択し、必要であれば カウンタを変更してください。するとチェック対象のイベントの一覧に、 緑色の行が追加されます。また、それらの行にマウスカーソルを合わせると、 ステータス行にヘルプメッセージが表示されます。 Configuration (設定) タブを利用すると、バッファと CPU サイズ、冗長出力オプションなどを設定する ことができます。最後に Start (開始) を押すと、 OProfile を実行することができます。

図8.1 OProfile 向け GUI

OProfile 向け GUI

8.6. レポートの作成

レポートを生成する前に、まずは OProfile が /var/lib/oprofile/samples ディレクトリ内にダンプを 出力していることを確認してください。なお、ダンプ出力は opcontrol --dump コマンドで行なうこと ができます。レポートは、それぞれ opreport または opannotate のコマンドで行なうことができます。

oreport をパラメータ無しで実行すると、完全な概要情報を 出力します。パラメータとして実行ファイルを指定すると、その実行ファイルから の情報のみを出力します。 C++ 言語で書かれたアプリケーションを分析する場合は、 --demangle smart オプションをご利用ください。

一方の opannotate コマンドでは、ソースコードから注釈情報 を出力します。下記のようなオプションを指定して実行します:

opannotate --source \
   --base-dirs=BASEDIR \
   --search-dirs= \
   --output-dir=annotated/ \
   /lib/libfoo.so

--base-dir オプションには、実行ファイル内のデバッグ情報が 利用するソースコードのパスを、カンマ区切りで指定します。ここで指定するパスは --search-dirs での指定よりも前に使用します。 --search-dirs オプションは、ソースコードを検索するディレクトリ を、カンマ区切りで指定します。

[Note]注釈付きソースの不確実性について

コンパイラの最適化機能を設定すると、そのときのオプション設定やソースコード の状態によっては、部分的にコードが削減されたり追加されたりする場合があります。 http://oprofile.sourceforge.net/doc/debug-info.html にある情報をお読みになり、どのようなことが起こるのかを知っておいてください。

8.7. さらなる情報

この章では大まかな説明のみを行なってきました。より詳しい情報については、それぞれ 下記のリンク先 (それぞれ英語です) をお読みください:

http://oprofile.sourceforge.net

プロジェクトの Web ページです。

マニュアルページ

各種ツールのオプションについて、詳しい説明が書かれています。

/usr/share/doc/packages/oprofile/oprofile.html

OProfile のマニュアルが用意されています。

http://developer.intel.com/

Intel プロセッサのアーキテクチャ仕様が書かれています。

http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22007.pdf

AMD Athlon/Opteron/Phenom/Turion 向けのアーキテクチャ仕様が書かれています。

http://www-01.ibm.com/chips/techlib/techlib.nsf/productfamilies/PowerPC/

IBM iSeries, pSeries, ブレードサーバシステムにおける、 PowerPC64 プロセッサのアーキテクチャ仕様が書かれています。


openSUSE システム分析とチューニングガイド 13.1