# perf
perf(1) は Linux カーネルの公式プロファイラで、カーネルソースツリーの `tools/perf` 以下に含まれる。プロファイリング・トレーシング・スクリプティングの機能を持つ多機能ツールで、カーネルの perf_events サブシステム(Performance Counters for Linux/PCL、Linux Performance Events/LPE とも呼ばれる)のフロントエンドとして動作する。perf_events と perf(1) フロントエンドは PMC(Performance Monitoring Counter)機能としてスタートしたが、その後トレースポイント・kprobe・uprobe・USDT といったイベントベースのトレーシングソースもサポートするように成長した。大規模で複雑なユーザーレベルプログラムでありながら Linux カーネルソースツリーに含まれている点で特異な存在であり、この形は perf(1) と Linux 双方の開発にメリットがあったとされる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 13 perf]] 冒頭・脚注†1)
## 概要
- **強み**: 特に CPU の分析(CPU スタックトレースのプロファイリング/サンプリング、CPU スケジューラのふるまいのトレーシング、サイクルレベルのマイクロアーキテクチャ解析)に優れる。トレーシング機能はディスク I/O とソフトウェア関数の関係など他の対象の分析にも使える。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 13 perf]] 冒頭)
- **サブコマンド構成**: 機能はサブコマンドで呼び出す。中心となるのは `list`(イベント一覧)・`stat`(イベント計数)・`record`(イベント記録)・`report`(サマリー表示)・`script`(個別サンプル表示)・`trace`(ライブシステムコールトレース)・`probe`(動的プローブ定義)で、ほかに `c2c`・`kmem`・`kvm`・`lock`・`mem`・`sched` など特化型のサブコマンドも持つ。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 13 perf]] §13.1, 表13-1)
- **イベントモデル**: `perf list` が返すイベントは Hardware event・Software event・Hardware cache event・Kernel PMU event・Raw hardware event descriptor・Hardware breakpoint・Tracepoint event・SDT event・pfm-events に分類される。[[kprobe]]・[[uprobe]]・USDT は「プローブイベント(probe event)」として動的に初期化した後にのみ Tracepoint event として現れる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 13 perf]] §13.3, §13.7)
- **フレームグラフ対応**: Linux 5.8 以降は `perf script report flamegraph` によって perf(1) 単体で[[フレームグラフ]]を生成できる。それ以前は `perf script` の出力を `stackcollapse-perf.pl` → `flamegraph.pl` のパイプラインに渡す必要があった。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 13 perf]] §13.11.1)
- **可観測性ツールとしての位置づけ**: 『詳解 システム・パフォーマンス 第2版』4章はトレースポイント・kprobe・uprobe・USDT・PMC といった情報ソースをオーバーヘッド実測値付きで体系的に説明しており、perf(1) はこれらすべてのイベントソースを横断的に扱うフロントエンドとして位置づけられる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 4 可観測性ツール]])
## 関連
- 概念: [[kprobe]] / [[uprobe]] / [[動的計装]] / [[ハードウェアカウンタ]] / [[フレームグラフ]] / [[Instructions Per Cycle]]
- エンティティ: [[Brendan Gregg]]
- ソース: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 13 perf]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 4 可観測性ツール]]