最終更新日 2025年1月29日
Linux perf とは?
Linux perf (Performance Counters for Linux) は、Linuxカーネルが提供する強力なパフォーマンス計測ツールです。
CPUやメモリ、I/O、スケジューラなど、システム全体の動作を詳細に解析し、パフォーマンスの問題を特定するのに役立ちます。
perf は パフォーマンス解析 の幅広い用途に対応しており、以下のような場面で活用されます。
- アプリケーションの処理速度低下の原因を特定
- CPUやI/Oのボトルネックを調査
- システムのプロファイリング(特定の関数やスレッドのパフォーマンスを計測)
- カーネルレベルのパフォーマンス測定
例えば、システム全体の統計情報を素早く確認したい場合や、特定のプロセスがどの関数で時間を消費しているかを深掘りする際に有用です。
perf が必要な理由
システムのパフォーマンスが低下している場合、「何が問題なのか」を正確に特定するにはデータに基づいた分析が必要です。
perf を使えば、システムリソースの使用状況を詳細に記録し、最適化すべき箇所を明確にできます。
Linux の perf ってどんなツールですか?
Linux のパフォーマンス解析ツールだよ。CPU、メモリ、I/O など、システム全体の動きを調査して、ボトルネックを特定するのに使います。
top や htop と何が違うんですか?
top や htop はプロセスごとのリソース消費を表示するだけだけど、perf はどの関数やスレッドが問題なのかまで掘り下げられる。もっと詳細な分析ができるんだ。
具体的にはどんな問題を解決できますか?
例えば、CPU使用率が高いプロセスがどこで時間を使っているか、I/O待ちで遅くなっている原因、特定の関数やシステムコールがボトルネックになっていないか、といった問題を調査できるよ。
perfコマンドの基本
ここでは perf コマンドのインストール方法、基本的な使い方、主要なサブコマンド について解説します。
perf は強力なツールですが、正しく使うためには基本的な知識が必要です。
perf コマンドのインストール方法
perf は多くの Linux ディストリビューションでパッケージとして提供されています。
以下のコマンドでインストールできます。
- Ubuntu / Debian 系
sudo apt install linux-perf
- CentOS / RHEL 系
sudo yum install perf
- Arch Linux
sudo pacman -S perf
一部のディストリビューションでは linux-tools
パッケージとして提供されている場合もあります。
perf コマンドが見つからないんですが?
ディストリビューションによっては perf
がデフォルトでインストールされていないから、which perf
で確認して、なければパッケージマネージャーでインストールしてみて。
インストールしたのに command not found
って出ます…
カーネルバージョンと一致しないパッケージをインストールした可能性があるね。uname -r
でカーネルバージョンを確認して、対応する linux-tools-$(uname -r)
をインストールするといいよ。
perf の基本的な使い方
perf は以下の形式で実行します。
perf [サブコマンド] [オプション]
例えば、perf stat
を使って特定のコマンドの CPU 使用率などを計測できます。
perf stat ls
実行すると、以下のような統計情報が表示されます。
Performance counter stats for 'ls':
0.234567 task-clock # 0.000 CPUs utilized
1234 context-switches # 0.000 M/sec
5678 cpu-migrations # 0.000 M/sec
901234 page-faults # 3.456 M/sec
12345678901234 cycles # 123.456 GHz
このように、perf stat
はコマンド実行時のシステムパフォーマンスデータを計測できます。
perf を実行したら ‘Permission denied’ になりました!
perf は通常、root 権限が必要だから sudo perf stat ls
みたいに sudo
をつけて実行してみて。
sudo なしで使いたい場合はどうすればいいですか?
root 以外でも実行できるようにするには sudo sysctl -w kernel.perf_event_paranoid=1
で設定変更できるよ。ただ、セキュリティリスクもあるから注意が必要だね。
よく使われる主要なサブコマンド一覧
perf にはさまざまなサブコマンドがありますが、代表的なものを紹介します。
コマンド | 説明 | 使用例 |
---|---|---|
perf stat | システム全体の統計情報を取得 | perf stat ls |
perf record | パフォーマンスデータを記録 | perf record ls |
perf report | 記録したデータを解析 | perf report |
perf top | リアルタイムでパフォーマンスを監視 | perf top |
perf sched | スケジューラの動作解析 | perf sched record |
perf list | 利用可能なイベントの一覧表示 | perf list |
➡ 詳細はこちらの記事でご覧ください:「Linux perf コマンドのオプション一覧と解説」※作成中
どのサブコマンドを使えばいいかわかりません…
まずは perf stat
で簡単な統計を取ってみて、それでも問題がわからなければ perf record
で詳細なデータを取るのが基本かな。リアルタイムで監視したいなら perf top
が便利。
記録したデータを解析するには?
perf record
でデータを取ったら、perf report
で解析できるよ。どの関数や処理がボトルネックになっているのかが見えてくるよ。
perf の基本的な使い方を理解したところで、次は perf の出力結果の見方 について解説します。
perfコマンドの主なオプションとその解説
perf にはさまざまなサブコマンドが用意されており、用途に応じて使い分けることが重要です。
ここでは、代表的なサブコマンドの概要を紹介します。
perf stat
(システム全体の統計情報を取得)
特定のコマンドやプロセスの実行時に、CPU使用率やキャッシュミスなどの統計データを収集する。
perf stat ls
実行結果
Performance counter stats for 'ls':
0.234567 task-clock # 0.000 CPUs utilized
1234 context-switches # 0.000 M/sec
5678 cpu-migrations # 0.000 M/sec
901234 page-faults # 3.456 M/sec
12345678901234 cycles # 123.456 GHz
perf stat
の出力結果、何を見ればいいかわかりません…
CPU 使用時間 (task-clock
) やコンテキストスイッチ (context-switches
)、ページフォルト (page-faults
) などが重要だよ。処理の負荷がどこにあるかを確認するのに役立つよ。
perf record
(パフォーマンスデータの記録)
特定のコマンドを実行し、そのプロファイルデータを収集する。
perf record ls
このコマンドを実行すると、perf.data
というバイナリファイルが生成される。
このデータを後で perf report
で解析できる。
perf record
を実行したら perf.data
ってファイルができました。これってどう使うんですか?
このデータを perf report
で解析すると、どの関数がどれくらい時間を使ったのかが分かるよ。
perf report
(記録したデータの分析)
perf record
で収集したデータを解析し、どの関数やシンボルが多くのリソースを使用しているかを表示する。
perf report
実行すると、関数ごとの CPU 使用時間などが出力されます。
実際の出力結果
# Overhead Command Shared Object Symbol
# ........ ....... ................. ........................
30.12% ls libc.so.6 [.] __strcmp_avx2
20.45% ls libc.so.6 [.] __memcmp_avx2_movbe
15.23% ls ls [.] print_long_format
10.11% ls libc.so.6 [.] opendir
5.89% ls libc.so.6 [.] readdir</code>
perf report
の出力がたくさんあって、どこを見ればいいのかわかりません…
カラムの ‘Overhead’ が高い関数がパフォーマンスのボトルネックになっている可能性があるよ。まずはこの値が高い関数をチェックするといいよ。
perf top
(リアルタイムでのパフォーマンス監視)
top
コマンドのように、リアルタイムでパフォーマンスデータを表示します。
perf top
実行すると、現在動作しているプロセスやスレッドの CPU 使用状況がリアルタイムで更新されます。
perf top
の出力結果
Samples: 2K of event 'cpu-clock', 1000 Hz, Event count (approx.): 2000000
Overhead Shared Object Symbol
30.21% libc.so.6 [.] __memcmp_avx2_movbe
18.45% vmlinux [k] native_sched_clock
12.32% ls [.] print_long_format
8.91% libc.so.6 [.] opendir
7.55% vmlinux [k] schedule
6.12% ls [.] main
4.98% libc.so.6 [.] readdir
3.29% vmlinux [k] __x64_sys_futex
perf top
って top
コマンドと何が違うんですか?
top
はプロセスごとのCPU使用率を表示するだけだけど、perf top
はどの関数が CPU を多く使っているのかまで表示できるんだ。
perf sched
(スケジューラの動作解析)
スケジューラの動作を記録し、プロセスのスイッチングやスレッドの挙動を分析します。
perf sched record
記録後、以下のコマンドで解析できる。
perf sched latency
実際の出力結果
Task | Runtime | Switches | Average delay | Maximum delay
------------------+-----------+------------+---------------+--------------
bash | 50.12 ms | 12 | 4.18 ms | 12.45 ms
sleep | 10.00 ms | 2 | 5.00 ms | 10.00 ms
kworker/1:0 | 30.34 ms | 25 | 1.21 ms | 6.78 ms
perf sched
ってどんなときに使うんですか?
スレッドのスケジューリング遅延や、CPU コア間の移動(migration)がパフォーマンスに影響を与えているかを調べるときに使うよ。
perf list
(利用可能なイベントの一覧表示)
perf で取得可能なイベント(CPU の各種統計、キャッシュミス、メモリアクセスなど)の一覧を表示する。
perf list
実際の出力結果(一部抜粋)
List of pre-defined events (to be used in -e):
branch-misses [Hardware event]
cache-misses [Hardware event]
cpu-cycles [Hardware event]
instructions [Hardware event]
page-faults [Software event]
context-switches [Software event]
task-clock [Software event]
sched:sched_switch [Tracepoint event]
syscalls:sys_enter_read [Tracepoint event]
syscalls:sys_enter_write [Tracepoint event]
perf list
って何に使うんですか?
どんな種類のイベントが計測できるかを確認するのに使うよ。例えば perf stat -e cache-misses ls
のように、特定のイベントを指定して計測できるよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf コマンドのオプション一覧と解説」※作成中
perf の主なオプションを理解したところで、次は perf の出力結果の見方 について解説します。
perfコマンドの出力結果の見方
perf コマンドを使用すると、システムのパフォーマンスに関する詳細なデータが取得できます。
しかし、出力される情報が多く、どの数値をどのように解釈すればよいのか戸惑うこともあるでしょう。
ここでは、代表的な perf の出力結果の見方 について解説します。
perf stat
の出力結果の見方
perf stat
は、特定のコマンドの実行中に取得したパフォーマンスカウンタの統計を表示します。
実行コマンド
perf stat ls
出力結果
Performance counter stats for 'ls':
0.234567 task-clock # 0.000 CPUs utilized
1234 context-switches # 0.000 M/sec
5678 cpu-migrations # 0.000 M/sec
901234 page-faults # 3.456 M/sec
12345678901234 cycles # 123.456 GHz
perf stat
の出力結果、どの値をチェックすればいいですか?
基本的には task-clock
(CPU 使用時間)、context-switches
(コンテキストスイッチの回数)、page-faults
(ページフォルトの発生数)、cycles
(CPU サイクル数)あたりをチェックするといいよ。
context-switches
が多いと何が問題なんですか?
コンテキストスイッチが多すぎると、CPU のオーバーヘッドが増えて処理が遅くなる可能性がある。マルチスレッドのアプリケーションでは特に注意したい指標だね。
cycles
は何を意味しているんですか?
CPU のクロックサイクル数だよ。一般的には、サイクル数が多いほど CPU の負荷が高いことを意味する。ただし、プロセッサのアーキテクチャによっても異なるから、他の指標と合わせて分析するといい。
➡ 詳細はこちらの記事でご覧ください:「Linux perf stat の出力結果の読み方」※作成中
perf report
の出力結果の見方
perf record
で取得したデータを perf report
で解析すると、どの関数が多くの CPU 時間を消費しているのかが分かります。
実行コマンド
perf record ls
perf report
出力結果(抜粋)
# Overhead Command Shared Object Symbol
# ........ ....... ................ .......................
35.67% ls libc.so.6 [.] readdir
20.45% ls libc.so.6 [.] strcmp
15.23% ls libc.so.6 [.] malloc
perf report
の ‘Overhead’ って何ですか?
‘Overhead’ は、その関数がどれくらいの CPU 時間を消費したかの割合を示している。数値が高いほど、その関数がボトルネックになっている可能性があるよ。
特定の関数だけを解析したい場合はどうすればいいですか?
perf report
に --symbol
オプションをつけると、特定の関数だけを抽出できるよ。例えば perf report --symbol=readdir
みたいに使うよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf report の出力結果の見方」※作成中
perf top
の出力結果の見方
perf top
は top
コマンドのように、リアルタイムでパフォーマンスデータを表示します。
どの関数が CPU を多く使っているかをリアルタイムで確認できます。
実行コマンド
perf top
出力結果(抜粋)
Overhead Shared Object Symbol
40.32% libc.so.6 [.] readdir
30.12% myapp [.] process_data
10.45% kernel [.] schedule
perf top
で ‘kernel’ の関数が上位に出てくるのは問題ですか?
‘Overhead’ は、その関数がどれくらいの CPU 時間を消費したかの割合を示している。数値が高いほど、その関数がボトルネックになっている可能性があるよ。
アプリケーションの特定の関数だけを perf top
で見たいです。
perf top -p <PID>
を使えば、特定のプロセスの情報だけを表示できるよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf top の結果の見方と活用方法」※作成中
どの指標を重視すべきか?
perf の出力には多くの情報がありますが、特に以下の指標が重要です。
指標 | 説明 | 重要ポイント |
---|---|---|
task-clock | CPU がタスクを処理した時間 | 高いほど CPU 負荷が高い |
context-switches | コンテキストスイッチの回数 | 多すぎるとオーバーヘッドの原因 |
page-faults | ページフォルトの発生数 | 頻繁に発生するとパフォーマンス低下の可能性 |
cycles | CPU サイクル数 | 高いほど CPU 使用量が多い |
Overhead (perf report) | 関数ごとの CPU 使用率 | 数値が高い関数はボトルネックの可能性 |
結局、どの指標を優先的に見ればいいんでしょうか?
まずは task-clock
や Overhead
を見て、CPU を多く消費しているプロセスや関数を特定するのが基本。その後、context-switches
や page-faults
も確認して、何が原因で処理が遅くなっているのかを分析するといいよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf の出力結果を正しく読む方法」※作成中
次は、実際の現場での活用事例 について解説します。
現場で使える「perf」コマンド活用事例
ここまでで perf
コマンドの基本的な使い方や出力結果の見方を学びました。
しかし、実際の現場ではどのように perf
を活用すればよいのでしょうか?
この章では、具体的なユースケースをもとに、perf
を活用したパフォーマンス解析の方法 を解説します。
CPU 負荷が高いプロセスを特定する
問題
特定のプロセスが CPU を大量に消費しているが、どの関数がボトルネックになっているのかわからない。
手順
❶top
コマンドで CPU 負荷の高いプロセスの PID を確認
top -o %CPU
❷perf top
でリアルタイムの CPU 使用状況を分析
perf top
❸perf record
で負荷の高いプロセスのプロファイリングを取得
perf record -p <PID
❹perf report
で関数ごとの CPU 使用率を分析
perf report
サーバーの CPU 使用率が異常に高いんですが、何が原因かわかりません…
まず top
で CPU 負荷の高いプロセスを特定しよう。その後、perf top
や perf record
を使って、どの関数が CPU を多く消費しているのかを調べるといいよ。
perf top
の結果を見ると libc.so.6
の malloc
が多く出ています。これは問題ですか?
malloc
が多いということは、メモリ割り当てが頻繁に発生している可能性があるね。コードの中で不要なメモリ確保がないかチェックするといいよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf を使った CPU 負荷の高いプロセスの特定方法」※作成中
I/O がボトルネックになっているか調査する
問題
アプリケーションの動作が遅いが、CPU 使用率は低い。I/O の影響を調査したい。
手順
❶iostat
でディスク I/O の状況を確認
iostat -x 1
❷perf record
でシステム全体の I/O を監視
perf record -a -g -- sleep 5
❸report
で I/O に関連するシステムコールを調査
perf report --sort=dso
アプリが遅いのに CPU 使用率は低いです。何を疑うべきでしょうか?
CPU 負荷が低いのに遅い場合、I/O がボトルネックになっている可能性があるね。まず iostat
でディスク I/O の状況を確認してみよう。
perf report
を実行したら read()
や write()
が多く出てきました。これは何を意味しますか?
これはプロセスが頻繁にファイルを読み書きしていることを示している。大量の小さな I/O 操作が発生していないか、バッファリングを適切に使っているかを確認するといいよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf を使った I/O ボトルネックの調査方法」
特定の関数やスレッドのパフォーマンスを解析する
問題
アプリケーションの処理が遅く、どの関数がボトルネックになっているのか調べたい。
手順
❶perf record
でアプリケーションのプロファイリングを取得する
perf record -g -p <PID
❷perf report
で関数ごとの CPU 使用率を確認する
perf report
❸perf annotate
で詳細な命令レベルの分析を実施する
perf annotate
アプリケーションの特定の処理が遅いです。どの関数が原因か調べる方法はありますか?
perf record
でプロファイリングデータを取得して、perf report
で関数ごとの CPU 使用率を見てみよう。もし命令単位で解析したいなら perf annotate
も使えるよ。
perf report
で std::vector<int>::push_back
が高い割合を占めていました。これは改善できますか?
std::vector
の動的メモリ確保が原因で遅くなっているかもね。reserve()
を使って事前に容量を確保すれば改善するかもしれないね。
➡ 詳細はこちらの記事でご覧ください:「Linux perf を使った関数・スレッドのパフォーマンス解析」※作成中
実際のトラブルシューティング事例と対応方法
実際の開発・運用環境で perf
を活用した事例をいくつか紹介します。
ケース 1 ある Web サーバーで CPU 使用率が異常に高い
- 調査手順
perf top
→perf record
→perf report
- 原因 特定のリクエスト処理で
regex_match()
の CPU 使用率が 50% を超えていた - 対応 正規表現の処理を簡略化することで CPU 負荷を削減
ケース 2 バッチ処理の実行時間が異常に長い
- 調査手順
perf record -g
→perf report
→perf annotate
- 原因 ループ内で大量のメモリ確保 (
malloc/free
) が発生していた - 対応 メモリ確保の回数を減らし、
std::vector::reserve()
を適用
実際に perf
を使って問題を解決した例を知りたいです。
例えば、Web サーバーのレスポンスが遅いときに perf
でボトルネックを特定し、処理を最適化して高速化できたことがあるよ。
➡ 詳細はこちらの記事でご覧ください:「Linux perf を使ったトラブルシューティング事例集」※作成中
ゴリタン
インフラエンジニアとして、ネットワークとサーバーの運用・保守・構築・設計に幅広く携わり、
現在は大規模政府公共データの移行プロジェクトを担当。
CCNPやLPICレベル3、AWSセキュリティスペシャリストなどの資格を保有しています。