目次
概要
OProfile は動的なプログラム分析を行なうためのプロファイラです。実行中の プログラムに対してその動作を調査し、情報を収集することができます。収集した 情報は、さらなる最適化を行なうためのヒントとして閲覧することができます。
OProfile を使用するにあたっては、ラッパーライブラリを使用するように修正 したり、コンパイルし直したりする必要はありません。カーネルに対する修正も 不要です。アプリケーションをプロファイルする場合、プロファイル作業の負荷と 採取間隔にもよりますが、通常の使用範囲であれば、ごく少量のオーバーヘッドが あるだけです。
OProfile は、カーネルドライバとデータを収集するためのデーモンから構成されて います。また、 Intel, AMD などのプロセッサが提供する、パフォーマンス カウンタと呼ばれるハードウエアを使用して行ないます。 OProfile はカーネルや カーネルモジュール、カーネルの割り込みハンドラやシステムの共有ライブラリ、 その他のアプリケーションなど、すべてのコードをプロファイルすることができます。
新しいプロセッサであれば、パフォーマンスカウンタとしてハードウエア経由の プロファイルを行なうことができます。プロセッサの種類にもよりますが、多くの カウンタが用意されていて、それぞれカウント対象のイベントをプログラムする ことができます。またそれぞれのカウンタでは、サンプルを採取する頻度を設定する ことができます。小さい値ほどより頻繁に採取する意味になります。
最後に事後の処理では、すべての情報を収集したあと命令アドレスを各関数名に 置き換える作業を行ないます。
OProfile を使用するには oprofile
パッケージをインストールします。 OProfile はそれぞれ IA-64, AMD64, s390, PPC64
の各プロセッサ上で動作します。
なお、プロファイル対象のアプリケーションに対して提供されている、
*-debuginfo
パッケージをインストールしておくことを
お勧めします。カーネルをプロファイルしたい場合も同様に、
debuginfo
パッケージをインストールしてください。
OProfile は複数のユーティリティから構成され、それぞれプロセスのプロファイル 処理を行なうものと、そのプロファイルデータを処理するものに分かれています。 下記では、本章内で使用する各プログラムについて、概要を説明しています:
ソースコードやアセンブリに対して注釈を設定し、プロファイル情報に埋め込む コマンドです。
プロファイルセッションを制御 (開始や停止) したり、プロファイルデータを ダンプしたり、パラメータを設定したりします。
利用可能なイベントの一覧と、それらに対する簡単な説明を表示します。
サンプルのデータベースファイルを、対外的なバイナリ形式から ネイティブな形式に変換します。
プロファイルデータからレポートを生成します。
OProfile はカーネルとアプリケーションの両方をプロファイルできます。カーネルを
プロファイルする場合は、 OProfile に対して vmlinuz*
の場所を指定します。 --vmlinux
オプションを指定して、
vmlinuz*
の場所 (通常であれば /boot
内)
を指定してください。カーネルモジュールをプロファイルする必要がある場合は、
OProfile に対して特に何も指定する必要はありません。ただし、あらかじめ
http://oprofile.sourceforge.net/doc/kernel-profiling.html
(英語) を読んでおいてください。
アプリケーションをプロファイルする場合、通常はカーネルをプロファイルする必要は
ありませんので、 --no-vmlinux
オプションを指定して情報量を
減らしておくことをお勧めします。
もっともシンプルな方法でプロファイルを行なう場合は、まずデーモンを起動して データを収集し、デーモンを停止してレポートを作成する、という流れになります。 この方法をより詳しく書くと、下記のようになります:
シェルを起動して root
でログインします。
Linux カーネルを利用してプロファイルするか、もしくは利用せずにプロファイル するかを決めます:
Linux カーネルを利用するプロファイル. 下記のコマンドを実行します。これは opcontrol コマンドが非圧縮のイメージファイルを利用するためです:
cp /boot/vmlinux-`uname -r`.gz /tmp gunzip /tmp/vmlinux*.gz opcontrol --vmlinux=/tmp/vmlinux*
Linux カーネルを利用しないプロファイル. 下記のコマンドを実行します:
opcontrol --no-vmlinux
ある関数から別の関数を呼び出す様子を出力に含めたい場合は、
--callgraph
オプションと最大の呼び出し履歴数
(DEPTH
) を追加で指定します:
opcontrol --no-vmlinux --callgraph DEPTH
OProfile デーモンを起動します:
opcontrol --start Using 2.6+ OProfile kernel interface. Using log file /var/lib/oprofile/samples/oprofiled.log Daemon started. Profiler running.
前項の作業が完了したら、プロファイル対象のアプリケーションを起動します。
OProfile デーモンを停止します:
opcontrol --stop
収集したデータを
/var/lib/oprofile/samples
以下に出力します:
opcontrol --dump
レポートを作成します:
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 ...
OProfile デーモンをシャットダウンします:
opcontrol --shutdown
イベントの設定を行なうための一般的な手順は下記の通りです:
最適化のヒントを得るには、まず CPU-CLK_UNHALTED
と
INST_RETIRED
のイベントを指定して使用します。
ボトルネックを検出するため、特定のイベントを指定して使用します。
イベントの一覧を表示するには、 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
CPU_CLK_UNHALTED の採取間隔によってもたらされる負荷について | |
---|---|
短い時間間隔でサンプリングを行なうと、システムに高い負荷をかけることに なってしまうほか、場合によってはフリーズしてしまうことがあります。 |
OProfile 向けの GUI は、 root
から oprof_start
コマンドで起動することができます (図8.1「OProfile 向け GUI」
のように表示されます) 。あとは採取したいイベントを選択し、必要であれば
カウンタを変更してください。するとチェック対象のイベントの一覧に、
緑色の行が追加されます。また、それらの行にマウスカーソルを合わせると、
ステータス行にヘルプメッセージが表示されます。
(設定) タブを利用すると、バッファと CPU サイズ、冗長出力オプションなどを設定する
ことができます。最後に (開始) を押すと、 OProfile
を実行することができます。
レポートを生成する前に、まずは 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
オプションは、ソースコードを検索するディレクトリ
を、カンマ区切りで指定します。
注釈付きソースの不確実性について | |
---|---|
コンパイラの最適化機能を設定すると、そのときのオプション設定やソースコード の状態によっては、部分的にコードが削減されたり追加されたりする場合があります。 http://oprofile.sourceforge.net/doc/debug-info.html にある情報をお読みになり、どのようなことが起こるのかを知っておいてください。 |
この章では大まかな説明のみを行なってきました。より詳しい情報については、それぞれ 下記のリンク先 (それぞれ英語です) をお読みください:
プロジェクトの Web ページです。
各種ツールのオプションについて、詳しい説明が書かれています。
/usr/share/doc/packages/oprofile/oprofile.html
OProfile のマニュアルが用意されています。
Intel プロセッサのアーキテクチャ仕様が書かれています。
AMD Athlon/Opteron/Phenom/Turion 向けのアーキテクチャ仕様が書かれています。
IBM iSeries, pSeries, ブレードサーバシステムにおける、 PowerPC64 プロセッサのアーキテクチャ仕様が書かれています。