linux でサンプリングベースのプロファイルを取る場合は、数年前までは oprofile が定番でしたが、最近は perf が主流です。oprofile よりも perf のほうが高機能で、かつ簡単に利用できます。
以下、本エントリでは、perfコマンドのインストール方法、perfコマンドの自前パッケージの作成方法、について手順をまとめます。
perfコマンドの具体的な使い方等は、別エントリに書くので、そちらをご覧ください。
インストール方法
大抵のディストリビューションでは、すでにパッケージが用意されています
debian なら
$ sudo apt-get install linux-perf
またはバージョンを指定して(たとえば linux kernel 5.3系の場合)
$ sudo apt-get install linux-perf-5.3
でインストールできます
$ 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 にまとめます。