このページの目次
perf の深い活用
カバー範囲: perf record/report/annotate → フレームグラフ → perf stat → PEBS → perf probe → パフォーマンス分析手法 対象: Linux perf_events (カーネル 2.6.31 以降)
perf stat: CPU パフォーマンスカウンター
# カウンタ型: プログラム実行全体を通じたハードウェアイベント
# 出力例:
# 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 record: サンプリング
# サンプリング (デフォルト: cycles, サンプリングレート 4000 Hz):
# 報告:
# アノテーション (ソースコード+アセンブリ+サンプリングの混合):
# リアルタイム top:
フレームグラフ
# 1. サンプリング:
# 2. フレームグラフの生成 (Brendan Gregg のツールを使用):
# または 1 行コマンド:
| |
perf probe: 動的プロービング
# 任意のユーザー空間関数にプローブポイントを付与:
# 任意の行にプローブポイントを付与:
# 記録:
# 付与済みのプローブポイントを確認:
# 削除:
PEBS: 高精度サンプリング
# デフォルトのサンプリング: 割り込み後に命令ポインタを読み取る (不正確な場合があり、スキッドが発生する)
# PEBS (Precise Event-Based Sampling): ハードウェアが正確な IP を記録
システムレベル分析
# システム全体のサンプリング (root 権限が必要):
# プロセスでフィルタリング:
# CPU でフィルタリング:
# CPU 利用率の分解 (topdown):
# frontend bound / backend bound / bad speculation / retiring
パフォーマンス分析手法
参考
- ドキュメント: 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