Howto

Oprofileを使用してプロファイルを取る

時間制約の厳しいプログラムを作成した場合、実行速度が問題になることがあります。実行速度のボトルネックとなるのはプログラムのごく一部のアルゴリズムに問題がある場合が多いようです。そこで、プログラムの実行速度を改善しようとした場合、プログラムのどの部分(関数)がどれだけ時間を消費しているのかという、プログラムの「プロファイル」を調べる必要があります。プロファイルを作成するプログラムをプロファイラといいます。

Linuxで使用できるプロファイラは、gprof、sysprofなどいくつかありますが、本HowtoではOprofileを使用してプロファイルをとる方法を説明します。Oprofileは、対象のアプリケーションプログラムだけでなく、カーネルも含めたLinuxシステム全体に渡ってプロファイルを取ることができるプロファイラです。

大まかな手順は以下の通りです。

  1. Oprofileを有効にしたカーネルイメージを作成する
  2. Oprofileをセルフコンパイルする
  3. Oprofileをインストールする
  4. Oprofileでプロファイルを取る

動作確認をおこなった環境は以下の通りとなります。

1. Oprofileを有効にしたカーネルイメージを作成する

Armadillo-500 開発セットと、Armadillo-500 FX 液晶モデルでは、使用しているカーネルのバージョンが異なるため、手順に若干の違いがあります。

1.1. linux-2.6.18-at(Armadillo-500 開発セット)の場合

カーネルのコンフィグレーションでOprofileを有効にします。

[PC ~]$ wget https://download.atmark-techno.com/armadillo-500/source/kernel/linux-2.6.18-at11.tar.gz
[PC ~]$ cd linux-2.6.18-at11/
[PC ~/linux-2.6.18-at10]$ make armadillo500_defconfig
[PC ~/linux-2.6.18-at10]$ make menuconfig

以下の設定を有効にしてください。

Linux Kernel Configuration
Profiling support  --->
  [*] Profiling support (EXPERIMENTAL)            <- チェックを入れる
  <*>   OProfile system profiling (EXPERIMENTAL)  <- チェックを入れる

イメージを作成します。

[PC ~/linux-2.6.18-at10]$ make
[PC ~/linux-2.6.18-at10]$ ls arch/arm/boot/zImage
arch/arm/boot/zImage                              <- 起動用のカーネルイメージとして使用します
[PC ~/linux-2.6.18-at10]$ ls vmlinux              <- Oprofileが使用するvmlinuxイメージとして使用します
vmlinux

1.2. linux-2.6.26-at(Armadillo-500 FX 液晶モデル)の場合

カーネルのコンフィグレーションでOprofileを有効にします。

[PC ~]$ wget http://armadillo.atmark-techno.comhttps://download.atmark-techno.com/armadillo-500-fx/source/kernel/linux-2.6.26-at4.tar.gz
[PC ~]$ cd linux-2.6.26-at4/
[PC ~/linux-2.6.26-at4]$ make armadillo500fx_dev_defconfig
[PC ~/linux-2.6.26-at4]$ make menuconfig

以下の設定を有効にしてください。

Linux Kernel Configuration
  General setup  --->
    [*] Profiling support (EXPERIMENTAL)          <- チェックを入れる
    <*> OProfile system profiling (EXPERIMENTAL)  <- チェックを入れる

イメージを作成します。

[PC ~/linux-2.6.26-at3]$ make
[PC ~/linux-2.6.26-at3]$ ls arch/arm/boot/zImage
arch/arm/boot/zImage                              <- 起動用のカーネルイメージとして使用します
[PC ~/linux-2.6.26-at3]$ ls vmlinux               <- Oprofileが使用するvmlinuxイメージとして使用します
vmlinux

2. Oprofileをセルフコンパイルする

OprofileをターゲットのArmadillo-500上でセルフコンパイルします。

まずは、Armadillo-500 ソフトウェアマニュアルの「6.コンパクトフラッシュシステム構築」もしくは、Armadillo-500 FX 液晶モデル ソフトウェアマニュアルの「6.USB SSD システム構築」の手順に従って、Debian GNU/Linux etchでユーザランドを構築してください。

このとき、カーネルのイメージには、手順1.で作成したカーネルイメージ(zImage)を使用します。Armadillo-500 開発セットの場合は、zImageをCFのパーティション1(/dev/hda1)のbootディレクトリにImage.gzという名前で保存します。Armadillo500 FX 液晶モデルの場合は、zImageを内蔵NORフラッシュメモリーのカーネル領域に書き込みます。

次に、セルフコンパイルに必要なツールをインストールします。Debianでシステムを起動したあと、以下のようにしてapt-get installでツールをインストールしてください。作業は、rootで行って下さい。なお、ワーニングが大量に表示されるのを防ぐため、apt-getを実行する前にシステム時刻を合わせておいてください。

[armadillo ~]# date -s "2001/02/03 04:05:06"         <- 時刻を設定します。例では、2001年2月3日 4時5分6秒に設定しています
[armadillo ~]# apt-get update
[armadillo ~]# apt-get install binutils-dev gcc g++ libpopt-dev make patch

次に、Oprofile 0.9.4のソースコードをコンパイルします。事前に、ARM11をサポートするためのパッチを適用します。

[armadillo ~]# wget http://prdownloads.sourceforge.net/oprofile/oprofile-0.9.4.tar.gz
[armadillo ~]# wget http://download.atmark-techno.com/sample/oprofile-howto/oprofile-0.9.4_support-arm11.patch
[armadillo ~]# tar xzvf oprofile-0.9.4.tar.gz
[armadillo ~]# cd oprofile-0.9.4
[armadillo ~/oprofile-0.9.4]$ patch -p1 < ../oprofile-0.9.4_support-arm11.patch
[armadillo ~/oprofile-0.9.4]$ ./configure --with-kernel-support
[armadillo ~/oprofile-0.9.4]$ make

セルフコンパイルには30分弱かかります。気長に待ちましょう。

3. Oprofileをインストールする

以下のコマンドで、oprofileをインストールします。

[armadillo ~/oprofile-0.9.4]$ make install

また、カーネルのプロファイルを取るために、手順1.で作成したvmlinxファイルを/bootに配置します。

4. Oprofileでプロファイルを取る

以下のように、opcontrolコマンドにより、somecommandを実行したときのプロファイルを取ることができます。

[armadillo ~]# opcontrol --vmlinux=/boot/vmlinux --callgraph=20
[armadillo ~]# opcontrol --start
[armadillo ~]# somecommand
[armadillo ~]# opcontrol --dump
[armadillo ~]# opcontrol --stop

プロファイル結果は、opreportコマンドで見ることができます。

[armadillo ~]# opreport --callgraph                  <- プロファイル結果をコールグラフとして表示します
[armadillo ~]# opreport --symbols                    <- シンボルごとの実行時間を表示します

詳細については、oprofileのマニュアルを参照してください。

ファイルのダウンロード

本Howtoで作成したファイルは以下からダウンロードすることができます。