2009年10月20日

perfコマンドを試してみる(2) 関数ごとのオーバーヘッド

perfコマンドでおそらく一番良く使われることになるのはこれでは無いかと思います。
perf recordコマンドでコマンド実行の際のデータを収集し、

% perf record -- ./saa build chr22.txt
[ perf record: Captured and wrote 20.376 MB perf.data (~890258 samples) ]

perf reportコマンドで結果を出力します。

% perf report
# Samples: 386487
#
# Overhead Command Shared Object Symbol
# ........ ....... ......................... ......
#
56.26% saa ./saa [.] induceSA
39.16% saa ./saa [.] sais_main
0.57% saa ./saa [.] suffix_array::build_buffer(std::vector<unsigned c
0.54% saa [kernel] [k] copy_user_generic_string
0.29% saa [kernel] [k] clear_page_c
0.18% saa ./saa [.] getBuckets
0.11% saa /lib/libc-2.10.1.so [.] memset
...


この例ではSA-ISを使って遊んでいたので、saisの関数が表示されれています。どこで時間を使っているかが一目瞭然ですね。

call graph付きでプロファイルを取ることもできます。この場合、-g付きでrecordを走らせ、reportも-g付きで実行します。ただ、この場合ユーザープログラムの側のcall graphは見えません。理由はちょっと謎なので後で調べてみようと思います。

% rm perf.data
% perf record -g -- ./saa build chr22.txt
% perf report -g
55.16% saa ./saa [.] induceSA

38.59% saa ./saa [.] sais_main

0.59% saa [kernel] [k] copy_user_generic_string
|
|--85.17%-- generic_perform_write
| generic_file_buffered_write
| xfs_write [xfs]
| xfs_file_aio_write [xfs]
...


しかし、perfはただのCPU時間プロファイラではありません。perf listをするとperfで取れるパフォーマンスカウンタの一覧が分かります。cache miss, branch miss, TLB miss, page faults, kernel page allocationなども取ることができます。(回数ではなく、オーバーヘッドを計測するものと思われます。この辺はprefの実装にも関係してくるのですが、後ほど時間があれば調べて書きたいです)
% perf record -e branch-misses -- ...
% perf report


常日頃からCPUに必要なのは良いプロファイラだと言っている(嘘)私ですが、perfは素晴らしいです。このご時世にC/C++をわざわざ使っているようなプログラマはこの恩恵が分かるはずです。みなさん進んで2.6.31のヒトバシラーになりましょう!!!1121!

(次回に続く)

おまけ
前回のやり方だとmanが入らないので、追加で
sudo aptitude install asciidoc
make doc && make install-doc

しておくと良いです。
posted by chun at 06:09| 日記