Linux perf コマンド

Linux コマンド大全


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:より詳細なイベントを表示

例:

例

# ls コマンドの実行状況を統計
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:記録するイベントを指定

例:

例

# ls コマンドの実行状況を記録
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.data ファイルを分析
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回の実行のパフォーマンス差異を比較

例

# 1回目の実行
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 使用のコツ

  1. オーバーヘッドを削減:長時間実行するパフォーマンス分析では、サンプリング周波数を適切に下げます(例: -F 99)

  2. シンボル解決:デバッグシンボルを利用可能にします。デバッグパッケージのインストールや -g オプションでのコンパイルを行います

  3. フレームグラフの生成:FlameGraph ツールと組み合わせて直感的なパフォーマンス分析図を生成します

  4. マルチコア分析:-a オプションですべてのCPUを監視するか、-C で特定のCPUを指定します

  5. ユーザー/カーネル空間の分離:-k と -u オプションを使用して、カーネル空間とユーザー空間をそれぞれ分析します


よくある問題の解決

  1. 権限の問題:

    echo -1 > /proc/sys/kernel/perf_event_paranoid

    または sudo で perf を実行します

  2. シンボル情報の不足:

    • プログラムが -g オプションでコンパイルされていることを確認
    • デバッグシンボルパッケージをインストール
  3. サンプリングデータが大きすぎる:

    • サンプリング周波数を下げる
    • サンプリング時間を短縮
    • --no-call-graph を使用してコールグラフ情報を削減
  4. Java/Python などの高級言語を解析できない:

    • 特定の言語向けのperfツールサポートが必要
    • 言語固有の分析ツールの使用を検討

さらに学ぶためのリソース

  1. 公式ドキュメント:Linuxカーネルソースコード内の tools/perf/Documentation ディレクトリ

  2. おすすめの書籍:

    • 《Systems Performance: Enterprise and the Cloud》
    • 『性能の頂点:システム、企業、クラウドコンピューティングの洞察』
  3. オンラインリソース:

    • Brendan Gregg のブログとツールセット
    • perf-tools ツールセット
  4. 関連ツール:

    • FlameGraph:パフォーマンスデータの可視化
    • bpftrace:より柔軟な動的トレース

perf コマンドを習得することで、Linux システムのパフォーマンス特性を深く分析し、パフォーマンスのボトルネックを迅速に特定して、アプリケーションとシステム設定を最適化できます。


Linux コマンド大全

その他の拡張