perf ("Perf Events"あるいは"perf tools"。元々は"Performance Counters for Linux"やPCLと呼ばれていた)は、Linuxカーネル2.6.31以降で使用可能な、Linuxの性能解析ツールである。
'perf'というユーザースペースの操作ユーティリティーは、Gitのようなサブコマンドを持つインターフェースを採用している。このユーティリティーは、システム全体(カーネル及びユーザーコードの両方)、シングルCPU、あるいは数スレッドの統計プロファイリングが可能である。
また、perfはハードウェアパフォーマンスカウンタ、トレースポイント、ソフトウェアパフォーマンスカウンタ(例: hrtimer)、ダイナミックプローブ(例: kprobesやuprobes)をサポートしている。
2012年、IBMは(OProfileとともに)perfを、Linuxで使われる最も一般的な二つのパフォーマンスカウンタプロファイリングツールのうちの一つであると認めた。
サブコマンド
perfは以下のようなサブコマンドとともに使用する。
stat
: 一つのプログラムやある時間でのシステムのトータルイベントカウントを測るtop
: topライクな最も使用された関数の動的表示record
: 一つのプログラムのサンプリングレートを測り保存するreport
: perf recordによって生成されたファイルを分析(perf recordはフラットやグラフプロファイリングが生成可能)annotate
: ソースまたはアセンブリを注解するsched
: スケジューラー動作とレイテンシのトレース・測定list
: 利用可能なイベントを一覧する
実装
このユーティリティとカーネル間のインターフェースは一つのシステムコールのみからなり、ファイルディスクリプタとmmapされたメモリ領域を通して完了する。
oprofileやLTTngとは違い、サービスデーモンは不要であり、大部分の機能はカーネルに統合されている。perfユーティリティは定期的にmmapされたバッファーからディスクへと生データをダンプする。
R. Vitillo(LBNL)は、「perfは低オーバーヘッドのプロファイリングツールである」と述べている。
2010年時点で、ハードウェアカウンターのサポートをするアーキテクチャは以下の通りである。x86、PowerPC64、UltraSPARC (III及びIV)、ARM(v5、v6、v7、Cortex-A8及び-A9)、Alpha EV56、SH。
新しいインテルCPUにおけるLast Branch Recordsとbranch tracingの実装の使用はパッチを適用するで利用できる。
perfはRHEL6、Debian Squeezeやその他のポピュラーなLinuxディストリビューションで対応されている。
批評
perfのドキュメントはあまり詳しくなく(2012年時点)、たとえば、大部分のイベントやそれらのエイリアスがドキュメント化されていない。また、perf toolsは、本当のwall-clock時間に基づいたプロファイリングを行えない。
Linuxカーネル 2.6.37から3.8.8までおよびRHEL6カーネル 2.6.32のPerfサブシステムは、ローカルユーザーからroot特権へと昇格可能なことが実証されたセキュリティ脆弱性が含まれる(CVE-2013-2094)。この問題は、event_idの検証コードパスにおいて、間違った型(64ビットの代わりに32ビットint)を使用したことが原因であった。
関連項目
- en:Performance Application Programming Interface
- 性能解析
- en:List of performance analysis tools
出典
外部リンク
- perf's wiki on kernel.org
- Arnaldo Carvalho de Melo, The New Linux ’perf’ tools, presentation from Linux Kongress, September, 2010
- Linux kernel profiling with perf tutorial
- Hardware PMU support charts - check perf_event column