Google-perftoolsを使ってCPUプロファイリングをとる
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
目次 |
google-perftoolsとは
グーグル株式会社で開発、公開されている高速mallocやCPUプロファイリングと解析などを行うオープンソースのツール群です。 こここではサンプリングベースのCPUプロファイラーである cpu profiler を紹介します。 cpu profilerはアーキテクチャーに依存しないLinux用ソフトウェアなので当然Cellでも使用することが可能です。
ここでプロファイルの測定対象としたソースコードはこれです。 Media:Google-perftools-cpuprofile.tar.gz
google-perftoolsのインストール
google-perftoolsはこちらからダウンロードできます。http://goog-perftools.sourceforge.net/ バイナリパッケージ(*.rpm)はないのでソースをダウンロードしてコンパイルします。 現在はversion 0.94.1が公開されています。google-perftools-0.94.1.tar.gz コンパイルは ./configureして makeするだけです。make installでインストールするときだけsuでrootになってください。 ppcの場合は0.94.1のbuildに失敗しますので、Cell上でgoogle-perftoolsを利用する場合にはversion 0.8を利用してください。 また、64bit用intel Linuxの場合にはlibunwindというライブラリをインストールしないとmakeができないという問題がありますので、 展開したファイルの中にあるINSTALLドキュメントを参照し、インストールしてください。
$ tar xvfz google-perftools-0.94.1.tar.gz $ cd google-perftools-0.94.1 $ ./configure $ make $ su $ make install
これでインストールは完了です。
Cpu profilerの使いかた
ライブラリとして libprofiler.so をリンクしてください。インクルードファイルは google/profiler.h です。
プログラム全体のプロファイルをとりたいとき
共有ライブラリとしてlibprofiler.soをリンクしてコンパイルします。ソースに対する修正はこれだけです。 -gオプションをつけてデバッグ情報を付加する必要もありません。
実行時にライブラリへのパスが必要なので環境変数の LD_LIBRARY_PATH を指定します。
$ setenv LD_LIBRARY_PATH /usr/local/lib
さらにプロファイルをとるトリガーとして環境変数 CPUPROFILE を設定します。値は測定結果を書き込むファイル名です。
$ setenv CPUPROFILE prof.out
これだけで準備は終了です。 プログラムを実行するとプロファイル結果が指定したファイルに書き出されます。
$ ./a.out PROFILE: interrupts/evictions/bytes = 439/0/508
プログラムの特定部分だけのプロファイルをとりたいとき
共有ライブラリとしてlibprofiler.soをリンクして、計りたい所を ProfilerStart ("file name") と ProfilerStop () で囲んでください。
ProfilerStart ("prof.out");
// ここが測定対象
ProfilerStop ();
prof.out はプロファイル結果を書き出すファイル名です。 実行時にライブラリへのパスがないので環境変数で LD_LIBRARY_PATH を指定します。
$ setenv LD_LIBRARY_PATH /usr/local/lib
これで準備は終了です。プログラムを実行するとプロファイル結果が指定したファイルに書き出されます。
$ ./a.out PROFILE: interrupts/evictions/bytes = 454/0/536
プロファイル結果の解析
測定結果は prof.out とします。解析プログラムは pprof という名前です。 実行したプログラムとプロファイル結果を引数にして起動してください。
$ ./pprof a.out prof.out (pprof)
プロンプトが表示されて止まります。使いかたは help コマンドを実行してください。 終了するときは quit です。 解析結果を表示するために top コマンドを使います。
(pprof) top
Total: 441 samples
220 49.9% 49.9% 220 49.9% func3
147 33.3% 83.2% 147 33.3% func2
74 16.8% 100.0% 74 16.8% func1
0 0.0% 100.0% 441 100.0% generic_start_main
0 0.0% 100.0% 221 50.1% _init
0 0.0% 100.0% 441 100.0% __libc_start_main
0 0.0% 100.0% 441 100.0% main
このように時間がかかった関数から順番に並んで表示されます。
さらにこの結果はコールグラフとしてきれいな図にして表示できます。 別途 graphviz というアプリケーションが必要です(コマンド名は dot ). 一旦 quit で pprof のプロンプトを終了します
(pprof) quit
コマンドラインから pprof を起動してドット形式のファイルを出力します。
$ pprof --dot a.out prof.out > prof.dot Dropping nodes with <= 2 samples; edges with <= 0 abs(samples)
変なメッセージが出ますが気にしません。 graphviz (dot) を使ってコールグラフを作り画像ファイル(png)で出力します。
$ dot -T png prof.dot > prof.png
画像ファイルを見るには適当な画像閲覧ソフトを使ってください。 私は kview を使いました。
$ kview prof.png
結果はこのようなコールグラフが得られました。 その関数が全体の何%の時間を使っているかが一目で分かります。ノードの大きさが処理時間に比例している事に注目してください。

