Linux perf コマンド
perf は Linux システムのパフォーマンス分析ツールセットで、正式名称は Performance Event Counters です。Linux カーネルの perf_events サブシステムに基づいており、ハードウェアおよびソフトウェアレベルのパフォーマンス分析機能を提供します。
perf の主な機能は次のとおりです:
- CPU パフォーマンス分析
- 関数呼び出しトレース
- ハードウェアイベント統計
- ソフトウェアイベント監視
- システムコールトレース
perf 基本構文
perf コマンドの基本構文形式は次のとおりです:
perf [--version] [--help] COMMAND [ARGS]
よく使うサブコマンドは次のとおりです:
stat:パフォーマンスカウンタ統計record:パフォーマンスデータの記録report:記録したデータの分析top:リアルタイムパフォーマンス監視list:利用可能なイベントの一覧表示annotate:ソースコードレベルの分析
perf よく使うサブコマンドの詳細
perf stat
コマンド実行中のさまざまなハードウェアおよびソフトウェアイベントを統計します。
perf stat [options] command [command-options]
よく使うオプション:
-e:監視するイベントを指定-p:指定したプロセスIDを監視-a:すべてのCPUを監視-r:繰り返し実行して平均値を表示-d:より詳細なイベントを表示
例:
例
perf stat ls
# 指定したプロセスを監視
perf stat -p 1234
# 特定のイベントを監視
perf stat -e cycles,instructions,cache-misses ls
perf record
パフォーマンスデータをファイルに記録します(デフォルトは perf.data)。
perf record [options] command [command-options]
よく使うオプション:
-g:コールグラフを記録-F:サンプリング周波数(Hz)-p:指定したプロセスを記録-o:出力ファイルを指定-e:記録するイベントを指定
例:
例
perf record ls
# 99Hzの周波数でプロセス1234を記録
perf record -F 99 -p 1234 -g
perf report
perf record で記録したデータを分析します。
perf report [options]
よく使うオプション:
-i:入力ファイルを指定-n:サンプル数を表示--stdio:テキストモードで出力-g:コールグラフを表示-s:指定したフィールドで並べ替え
例:
例
perf report
# 指定したファイルを分析しテキストモードで出力
perf report -i perf.data.old --stdio
perf top
システムで最もリソースを消費する関数をリアルタイムに表示します。
perf top [options]
よく使うオプション:
-e:監視イベントを指定-p:指定したプロセスを監視-K:カーネルシンボルを非表示-U:ユーザー空間シンボルを非表示-g:コールグラフを表示
例:
例
perf top
# 特定のイベントを監視
perf top -e cache-misses
perf list
監視可能なすべてのイベントを一覧表示します。
perf list [hw|sw|cache|tracepoint|pmu|event_glob]
例:
例
perf list
# ハードウェアキャッシュイベントを一覧表示
perf list cache
perf イベントタイプ
perf はさまざまなタイプのイベントを監視できます:
| イベントタイプ | 説明 | 例 |
|---|---|---|
| Hardware | CPUハードウェアイベント | cycles, instructions |
| Software | カーネルソフトウェアイベント | context-switches, page-faults |
| Cache | キャッシュ関連イベント | cache-references, cache-misses |
| Tracepoints | カーネル静的トレースポイント | syscalls, block, sched |
| PMU | プロセッサ固有イベント | (vendor specific) |
| Breakpoints | ブレークポイントイベント | mem:[:access] |
perf 実践応用例
1. プログラムのパフォーマンスボトルネックを分析
例
perf record -g ./my_program
# 結果を分析
perf report -g
2. CPUホットスポット関数の検索
perf top -p $(pidof my_program)
3. 2回の実行のパフォーマンス差異を比較
例
perf record -o perf.data.1 ./my_program input1
# 2回目の実行
perf record -o perf.data.2 ./my_program input2
# 差異を比較
perf diff perf.data.1 perf.data.2
4. システムコールの分析
例
perf list 'syscalls:*'
# open システムコールをトレース
perf stat -e 'syscalls:sys_enter_open' -a sleep 10
perf 使用のコツ
-
オーバーヘッドを削減:長時間実行するパフォーマンス分析では、サンプリング周波数を適切に下げます(例: -F 99)
-
シンボル解決:デバッグシンボルを利用可能にします。デバッグパッケージのインストールや -g オプションでのコンパイルを行います
-
フレームグラフの生成:FlameGraph ツールと組み合わせて直感的なパフォーマンス分析図を生成します
-
マルチコア分析:-a オプションですべてのCPUを監視するか、-C で特定のCPUを指定します
-
ユーザー/カーネル空間の分離:-k と -u オプションを使用して、カーネル空間とユーザー空間をそれぞれ分析します
よくある問題の解決
-
権限の問題:
echo -1 > /proc/sys/kernel/perf_event_paranoid
または sudo で perf を実行します
-
シンボル情報の不足:
- プログラムが -g オプションでコンパイルされていることを確認
- デバッグシンボルパッケージをインストール
-
サンプリングデータが大きすぎる:
- サンプリング周波数を下げる
- サンプリング時間を短縮
- --no-call-graph を使用してコールグラフ情報を削減
-
Java/Python などの高級言語を解析できない:
- 特定の言語向けのperfツールサポートが必要
- 言語固有の分析ツールの使用を検討
さらに学ぶためのリソース
-
公式ドキュメント:Linuxカーネルソースコード内の tools/perf/Documentation ディレクトリ
-
おすすめの書籍:
- 《Systems Performance: Enterprise and the Cloud》
- 『性能の頂点:システム、企業、クラウドコンピューティングの洞察』
-
オンラインリソース:
- Brendan Gregg のブログとツールセット
- perf-tools ツールセット
-
関連ツール:
- FlameGraph:パフォーマンスデータの可視化
- bpftrace:より柔軟な動的トレース
perf コマンドを習得することで、Linux システムのパフォーマンス特性を深く分析し、パフォーマンスのボトルネックを迅速に特定して、アプリケーションとシステム設定を最適化できます。
その他の拡張