perfは長期間開発が活発で今更な感がありますが、プロファイルに使ってみた のでメモを残します。
Table of Contents
1 perfとは
Linux上で動作するプロファイラです。 ハードウェアのパフォーマンスカウンタに対応している為、oprofile等の他 のプロファイラに比べて相当に軽いです。
2 インストール方法
2.1 ubuntuの場合
linux-toolsパッケージをインストールします。カーネルの版数に合わせた ものが必要となります。
sudo apt-get install linux-tools-[カーネルの版数]
私の環境では以下でした。
sudo apt-get install linux-tools-3.13.0-24-generic
2.2 centosの場合
perfパッケージをインストールします。
sudo yum install perf
3 使い方
perf [サブコマンド]でプロファイルの実行や閲覧を実現します。 manはperf-[サブコマンド]で閲覧できます(man perf-record等)。
3.1 プロファイルの実行
コマンドを走らせてプロファイルを実行します。コマンド実行後にプロファ イルの結果を保存したperf.dataというファイルが作成されます。
perf record -- [コマンド]
別ファイルに保存する場合は-oオプションで指定します。
perf record -o [ファイル] -- [コマンド]
3.2 プロファイルの閲覧
以下のコマンドでプロファイルの結果を閲覧します。ファイル名を指定しな い場合はperf.dataから結果を読みます。
perf report
ファイル名を指定する場合は-iオプションを使います。
perf report -i [プロファイルのファイル]
上記の場合はncursesベースのビューアで結果を閲覧できますが、–stdioオ プションを指定した場合にはlessライクなビューアで結果を閲覧できます。
perf report --stdio
4 コールグラフの出力
-gオプションを用いてプロファイルを実行します。
perf record -g [コマンド]
-gオプションのmanは以下の通りです。
-g, --call-graph Do call-graph (stack chain/backtrace) recording.
-g -Gを指定して結果を閲覧します。
perf report -g -G
それぞれのmanは以下の通りです。
-g [type,min,order], --call-graph Display call chains using type, min percent threshold and order. type can be either: -G, --inverted alias for inverted caller based call graph.
5 その他
5.1 perf-top
topコマンドライクなツールで、関数単位でcpu使用率を閲覧できます (要root権限)。
$ sudo perf top 29.29% perf [.] 0x0000000000050b0e 6.91% [kernel] [k] kallsyms_expand_symbol.constprop.1 4.44% libc-2.15.so [.] __strstr_sse2 3.95% libc-2.15.so [.] __strcmp_sse2 3.45% [kernel] [k] format_decode 3.07% libc-2.15.so [.] memchr 3.00% [kernel] [k] vsnprintf 2.27% libc-2.15.so [.] __memcpy_sse2 2.25% [kernel] [k] memcpy 2.10% [kernel] [k] string.isra.3 2.06% libc-2.15.so [.] critical_factorization
5.2 perf-stat
コマンド実行時のパフォーマンスカウンタの値を取得します。
$ perf stat [コマンド] Performance counter stats for '[コマンド]' 1.271820 task-clock # 0.118 CPUs utilized 29 context-switches # 0.023 M/sec 0 cpu-migrations # 0.000 K/sec 286 page-faults # 0.225 M/sec 2,463,690 cycles # 1.937 GHz [36.82%] 1,422,229 stalled-cycles-frontend # 57.73% frontend cycles idle 1,093,980 stalled-cycles-backend # 44.40% backend cycles idle 1,905,509 instructions # 0.77 insns per cycle # 0.75 stalled cycles per insn 367,270 branches # 288.775 M/sec 16,792 branch-misses # 4.57% of all branches [65.01%] 0.010764321 seconds time elapsed
5.3 perf-list
採取可能なイベントを出力します。本サブコマンドで出力されたイベントは他 のサブコマンドの-eオプションで指定できます。
$ perf list List of pre-defined events (to be used in -e): cpu-cycles OR cycles [Hardware event] instructions [Hardware event] cache-references [Hardware event] cache-misses [Hardware event] branch-instructions OR branches [Hardware event] branch-misses [Hardware event] bus-cycles [Hardware event] stalled-cycles-frontend OR idle-cycles-frontend [Hardware event] stalled-cycles-backend OR idle-cycles-backend [Hardware event] ref-cycles [Hardware event]
キャッシュミスの回数を見てみます。
$ perf stat -e cache-misses [コマンド] Performance counter stats for '[コマンド]': 5,716 cache-misses 0.001550605 seconds time elapsed
6 まとめ
性能評価やボトルネック解析にperfは役立つと思います。 動作が軽いので、リファクタリングの際に使うのもありだと思います。