perf(Linuxパフォーマンス解析ツール)
Linuxカーネルに組み込まれたプロファイリング/パフォーマンス解析ツール。もともと「Performance Counters for Linux (PCL)」として開発され、現在は「perf_events (LPE)」とも呼ばれるカーネルサブシステム上に構築されている。
できること
CPUのパフォーマンスモニタリングユニット(PMU)が持つハードウェアカウンタ(サイクル数、実行命令数、キャッシュミス、分岐ミス予測など)に加えて、ソフトウェアカウンタ・tracepoint・kprobe/uprobe(動的トレーシング)も統一的なインターフェースで扱える。straceと異なり、対象プログラムへのパフォーマンスへの影響が小さいとされる。
主なサブコマンド
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