gprof

使いかたは割と常識的チックな。 -pg つけて実行すると gmon.out ができるので gprof ./a.out とかするとなんか出る。 gprof -l -A -x とかでアノテートとか。

原理は GCC が関数呼び出しにフックかけてて mcount が呼ばれている。 -finstrument-functions とかで自分でも作れます。

タイマも使っていると教えていただきました。時間測定はタイマ使ったサンプリングベース。関数の出入りは mcount で厳密に。

google-perftools

Linux & x86 限定。

LD_PRELOAD=/usr/local/lib/libprofiler.so CPUPROFILE=/tmp/profile.out ./a.out
pprof ./a.out /tmp/profile.out

とかで実行。 .ctors と .dtors で main の前後に割込み。 setitimer でタイマ仕込んでタイマのハンドラで PC 取ってきて記録。後は解析ツールで解析。当然 gprof の方が正確and/or高速 (PROFILEFREQUENCY環境変数で調整) だけど手軽。

sysprof

kernel-2.6.11 以降を CONFIG_PROFILING オプションつきでコンパイル。後は sysprof で gtk+インターフェイスが出てくるのでもうサルでもわかって超手軽。システム全体のプロファイルが取れる。

この手のプロファイラ使ったこと無い人はスクリーンショットを見ると感動できそう。というか私が感動した。パフォーマンスはあんま落ちないと思う。

kernel モジュールでは一定時間おきに現在プロセスのスタックトレースを取得して /proc/sysprof-trace に吐く。クライアントはこれを見る。そんだけ。手軽。 /proc/sysprof-trace のフォーマットも超簡単。

OProfile

Linux 。色んなアーキテクチャに対応。但し CPU によっては性能を全部発揮できない。ノートPCだと残念な場合も。

これも kernel モジュール & クライアントユーティリティ。というか sysprof よりかなり古い。(参考: sysprofアナウンスへのoprofileでいいじゃんというコメントへの反論)

なんかもう色々できる。

% opcontrol --vmlinux=/usr/src/linux-2.6.15.4/vmlinux --callgraph=20 # 設定
% opcontrol --start        # 動け
% opcontrol --reset        # カウンタのリセット
% ./a.out                  # 実行
% opcontrol --dump         # 結果をファイルに保存
% opreport                 # 結果見る
% opreport -c              # コールグラフ見る
% opannotate -a -s         # ソースつきで見る
% opcontrol --stop         # 止める
% opcontrol --shutdown     # プロセスも止める

とかがよくありそうなストーリー。

google-perftools やら sysprof みたいなタイマーベースの実装以外にも、なんか CPU のプロファイル情報を使う。よって対応している CPU では出鱈目に多くのサンプル数を拾ってくれる。

あと、対応してる CPU だと opcontrol --event で拾うイベントを選択できる。L2キャッシュミスだけをカウントしたりできるのです。

/dev/oprofile に oprofilefs とかいうファイルシステムでマウント。なんか独自のプロファイラをここ見て作るのも面白そうなんだけど…

総評

  • gprof はめんどいけど正確。コンパイル時に仕込みが絶対必要。
  • google-perftools はなんか中途半端な気がしているんだ。まぁ非 Linux の外部プロファイラではある。
  • sysprof は手軽。外部から GUIスタックトレース見れる。わかった気になれる。
  • oprofile はすげえ。いい CPU なら gprof よりいいくらい。
  • こいう文章書くのは気楽でいいなぁ。
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h