perf を使ってプロファイルする方法(その1)

linux でサンプリングベースのプロファイルを取る場合は、数年前までは oprofile が定番でしたが、最近は perf が主流です。oprofile よりも perf のほうが高機能で、かつ簡単に利用できます。

以下、本エントリでは、perfコマンドのインストール方法、perfコマンドの自前パッケージの作成方法、について手順をまとめます。
perfコマンドの具体的な使い方等は、別エントリに書くので、そちらをご覧ください。

インストール方法

大抵のディストリビューションでは、すでにパッケージが用意されています

debian なら

$ sudo apt-get install linux-tools

でインストールできます

redhatfedoraなら

$ yum install perf

でインストールされる筈です(手元にredhatが無いので、うろ覚えです)

自前で、パッケージを作成する方法

perf はカーネルと連携して動作するため、 カーネルのバージョンと perf のバージョンを合わせておく必要があります。そのためカーネルを自前ビルドしている場合は、 ディストリビューション標準の perf パッケージが利用出来ません。そこで、 perf のパッケージを自前ビルドしてみたので、手順をメモします。作業した環境は debian です。

先ず、subversion で パッケージのソースコードを取ってきます。

$ svn co svn://svn.debian.org/kernel/dists/trunk/linux-tools

次にカーネルソースコードをダウンロード。今回は3.15.3を使いました

$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.15.3.tar.xz

先ほどsubversionで持ってきたソースコードのあるディレクトリに移動して

$ cd linux-tools

changelog ファイルを編集します。debian のパッケージは、基本的にchangelogからパッケージのバージョンを決めるので
changelog の先頭エントリのバージョン番号を3.15に修正します

$ vi debian/changelog

次に、専用のスクリプトで、パッケージのひな形から 3.15用の linux-tools のパッケージを生成します

$ ./debian/bin/genorig.py ../linux-3.15.3.tar.xz 
$ cd -
$ tar xfJ orig/linux-tools_3.15.orig.tar.xz 

以上の作業で、 linux-tools-3.15 と言う名前のディレクトリが出来上がります。

さらに、linux-tools-3.15/debian/control ファイルを自動生成します

$ cd linux-tools-3.15
$ cp -a ../linux-tools/debian .
$  ./debian/bin/gencontrol.py

最後に changelog を微調整します。

$ dch -i


後は、 *.deb をビルドするだけです。

まず依存関係を確認して、不足パッケージがあれば、apt-get install で追加インストールします

$ dpkg-checkbuilddeps

次にビルド。念の為一度 clean して余計なファイルを消してから、ビルドします

$ make -f debian/rules clean
$ dpkg-buildpackage -us -uc -rfakeroot

実際にビルドしてみると、 linux-3.15.3/drivers/staging/usbip/uapi/usbip.h  が無いというビルドエラーが出ました。このような場合はソースコードを修正して

$ dpkg-source --commit

でパッチを作成します

再度ビルドすると

$ dpkg-buildpackage -us -uc -rfakeroot

めでたく、 linux-tools-3.15_3.15-1.1_amd64.deb が出来上がりました。


あとはdebコマンドでインストールして、セットアップは完了です

$ sudo dpkg -i  linux-tools-3.15_3.15-1.1_amd64.deb

動作確認

とりあえず /bin/ls のプロファイルを取ってみます

$ perf stat /bin/ls

これで、簡単な統計情報が得られます。

より詳しいperfコマンドの使い方は、別エントリ http://d.hatena.ne.jp/pyopyopyo/20140817/p1 にまとめます。