perf(Linuxパフォーマンス解析ツール)
Linuxカーネルに組み込まれたプロファイリング/パフォーマンス解析ツール。もともと「Performance Counters for Linux (PCL)」として開発され、現在は「perf_events (LPE)」とも呼ばれるカーネルサブシステム上に構築されている。
できること
CPUのパフォーマンスモニタリングユニット(PMU)が持つハードウェアカウンタ(サイクル数、実行命令数、キャッシュミス、分岐ミス予測など)に加えて、ソフトウェアカウンタ・tracepoint・kprobe/uprobe(動的トレーシング)も統一的なインターフェースで扱える。straceと異なり、対象プログラムへのパフォーマンスへの影響が小さいとされる。
実装原理: perf_event_openシステムコール
内部的には計測対象のイベント1つにつきperf_event_open(2)を1回呼んでfdを1つ取得し、そのfdからread()でカウンタ値を読む。perf stat自体をstraceでトレースしてEACCES→フォールバックの挙動やハイブリッドCPUでのPMU別扱いを観察した記録をperf_event_open実験に残した。
主なサブコマンド
perf stat: プログラム実行中のパフォーマンスカウンタを集計して表示する。perf record: サンプリングデータを収集しperf.dataファイルに保存する。デフォルトはサイクルイベントを1000Hz(1秒間に1000サンプル)でサンプリング。perf report:perf recordで記録したサンプルを関数別のオーバーヘッドとして表示する。perf top:topコマンドのように、CPU時間を消費している関数をリアルタイムに表示する。perf annotate: 命令レベルでサンプル分布を表示し、ボトルネックをアセンブリ単位で特定する。
perf stat dd if=/dev/zero of=/dev/null count=1000000
perf record ./program
perf report
フレームグラフとの連携
perf record/perf reportで得たスタックトレースは、Brendan Greggのフレームグラフの入力データとしてよく使われる。複数サンプルに共通するコールパスを折り畳んで表示することで、ボトルネックを直感的に可視化できる。
コンパイラ最適化への利用
perf recordで採取したサンプリングベースのプロファイルは、Profile-Guided Optimization(PGO)のSamplePGO/AutoFDOという方式で、コンパイラの最適化判断(インライン化・コードレイアウトなど)にそのまま使うこともできる。
#linux #performance #profiling