このページの目次

perf の深い活用

カバー範囲: perf record/report/annotate → フレームグラフ → perf stat → PEBS → perf probe → パフォーマンス分析手法 対象: Linux perf_events (カーネル 2.6.31 以降)

perf stat: CPU パフォーマンスカウンター

# カウンタ型: プログラム実行全体を通じたハードウェアイベント
perf stat ls /

# 出力例:
#   task-clock:        # 実際の CPU 時間
#   cycles:            # CPU サイクル (周波数スケーリングの影響を受ける。ユーザー空間のみに制限するには cycles:u を使用)
#   instructions:      # 実行された命令数
#   IPC:               # instructions/cycles (>1 = スーパイプライン利用率が良好)
#   branches:          # ブランチ命令
#   branch-misses:     # ブランチ予測ミス
#   cache-misses:      # キャッシュミス
#   context-switches:  # コンテキストスイッチ
#   page-faults:       # ページフォルト

# 主要指標:
#   IPC < 0.5: 深刻なストール (キャッシュミス、ブランチミス、データ依存性)
#   IPC > 2:   スーパイプラインの高度な利用
#   branch-miss rate > 5%: ブランチ予測の問題
#   cache-miss rate > 10%: データの局所性の問題

# イベントの指定:
perf stat -e cycles,instructions,cache-references,cache-misses,branch-misses ./prog

perf record: サンプリング

# サンプリング (デフォルト: cycles, サンプリングレート 4000 Hz):
perf record -g ./prog        # -g: コールチェーン(呼び出しグラフ)を記録
perf record -F 99 -g ./prog  # 99 Hz サンプリング (フレームグラフの標準に近い)

# 報告:
perf report                   # インタラクティブ (関数/呼び出しチェーン)
perf report --sort=dso,sym    # .so ファイル + 関数名でソート
perf report -n --stdio        # テキスト形式 + サンプリング数

# アノテーション (ソースコード+アセンブリ+サンプリングの混合):
perf annotate function_name

# リアルタイム top:
perf top -e cycles

フレームグラフ

# 1. サンプリング:
perf record -F 99 -g -- ./prog

# 2. フレームグラフの生成 (Brendan Gregg のツールを使用):
perf script > out.perf
stackcollapse-perf.pl out.perf > out.folded
flamegraph.pl out.folded > flamegraph.svg

# または 1 行コマンド:
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg

perf probe: 動的プロービング

# 任意のユーザー空間関数にプローブポイントを付与:
perf probe -x ./prog my_function
perf probe -x ./prog 'my_function arg1=%di arg2=%si'   # 引数をキャプチャ

# 任意の行にプローブポイントを付与:
perf probe -x ./prog my_file.c:42

# 記録:
perf record -e probe_myprog:my_function -g -- ./prog

# 付与済みのプローブポイントを確認:
perf probe -l

# 削除:
perf probe -d my_function

PEBS: 高精度サンプリング

# デフォルトのサンプリング: 割り込み後に命令ポインタを読み取る (不正確な場合があり、スキッドが発生する)
# PEBS (Precise Event-Based Sampling): ハードウェアが正確な IP を記録
perf record -e cycles:pp ./prog    # :pp = precise (2レベル)
perf record -e cycles:ppp ./prog   # :ppp = 最も高精度 (ハードウェアサポートが必要)

システムレベル分析

# システム全体のサンプリング (root 権限が必要):
perf record -a -g -- sleep 10     # 全 CPU、10 秒間

# プロセスでフィルタリング:
perf record -e cycles -p <pid> -- sleep 10
perf record -e cycles -t <tid>    # スレッド単位

# CPU でフィルタリング:
perf record -e cycles -C 0,2 -- sleep 10

# CPU 利用率の分解 (topdown):
perf stat --topdown ./prog        # Intel 第6世代以降
# frontend bound / backend bound / bad speculation / retiring

パフォーマンス分析手法

パフォーマンス分析方法論: まずボトルネックを定性的に特定し、その後段階的に掘り下げる

疑われるもの 最初に定性分析に使用するもの その後、掘り下げに使用するもの

CPU バウンド? perf stat: IPC / 命令数 / サイクル perf record: ホットスポット関数の特定 メモリバウンド? perf stat: キャッシュミス, LLC-loads / LLC-load-misses perf record -e cache-misses I/O バウンド? iostat / blktrace perf trace (システムコールと所要時間のトレース) ロック競合? perf lock record + perf lock report perf stat -e context-switches ブランチ予測? perf stat -e branch-misses,branches perf record -e branch-misses まず perf stat でボトルネックの種類を定性的に特定し、その後 perf record / trace / lock で具体的な関数や呼び出しポイントまで段階的に掘り下げる。

参考

  • ドキュメント⁠: https://perf.wiki.kernel.org, Brendan Gregg's perf examples
  • ツール⁠: https://github.com/brendangregg/FlameGraph
  • 書籍⁠: "Systems Performance" (Brendan Gregg), "BPF Performance Tools"

キーワード: perf, PEBS, IPC, cache-misses, flame graph, perf probe, topdown, branch prediction