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

結果はこのようなコールグラフが得られました。 その関数が全体の何%の時間を使っているかが一目で分かります。ノードの大きさが処理時間に比例している事に注目してください。

画像:Google-prof.png



Cellプログラミングのレシピに戻る

表示
個人用ツール
Open Source Projects