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

出典

作成日時: 2026-08-11 22:28 / 更新日時: 2026-08-16 08:00