perfはLinuxのパフォーマンス分析ツールであり、パフォーマンス分析アーキテクチャを提供します。アプリケーションは、tracepointとカーネルカウンタを利用してパフォーマンス関連情報の統計を収集できます。これらの情報を活用することで、パフォーマンス上の問題の分析やパフォーマンスボトルネックの特定に役立ちます。
perf record
perf recordは、サンプリング情報を収集し、データファイルに記録するために使用されます。
コマンドライン形式:
perf record [-e <EVENT> | --event=EVENT] [-a] <command> [<options>]
パラメータ説明:
EVENTの取り得る値は次のとおりです:
- u:ユーザースペースでトリガーされたパフォーマンスイベントを表します。
- k:カーネルモードでトリガーされたパフォーマンスイベントを表します。
- h:ハイパーバイザーが生成したパフォーマンスイベントを表します。
- G:KVM仮想マシン上のクライアントで生成されたパフォーマンスイベントを表します。
- H:KVM仮想マシン上のホストで生成されたパフォーマンスイベントを表します。
-a:すべてのCPUを表します。
optionsの取り得る値は次のとおりです:
- -F:1秒あたりのサンプリング回数。値の範囲は[1,+∞)で、デフォルト設定は4000、推奨設定は99です。
- -p:分析対象のプロセスPIDを指定するために使用されます。
- -g:記録用の呼び出しスタックを表します。
- sleep:持続時間を秒単位で表します。値の範囲は[1,+∞)です。
perf stat
perf statは、指定されたプログラムのパフォーマンス概要を分析するために使用されます。
コマンドライン形式:
perf stat [-e <EVENT> | --event=EVENT] [-a] <command>
パラメータ説明:
EVENTの取り得る値は以下のとおりです:
- u:ユーザースペースでトリガーされたパフォーマンスイベントを表します。
- k:カーネルモードでトリガーされたパフォーマンスイベントを表します。
- h:ハイパーバイザーが生成したパフォーマンスイベントを表します。
- G:KVM仮想マシン上のクライアントで生成されたパフォーマンスイベントを表します。
- H:KVM仮想マシン上のホストで生成されたパフォーマンスイベントを表します。
-a:すべてのCPUを表します。
オプション:
- -p
:プロセスIDを指定します。 - -v:より多くのデータ情報を表示します。
- -r:平均を求めます。
- -C:指定されたCPUからパフォーマンスデータを収集します。
- -p
perf stat -p 120228 コマンドを実行すると、プロセスIDが120228のプログラムのパフォーマンス概要が表示されます。例:
$perf stat -p 120228
Performance counter stats for process id '120228':
1212814.537787 task-clock (msec) # 77.290 CPUs utilized (100.00%)
13,932,119 context-switches # 0.011 M/sec (100.00%)
4,504,797 cpu-migrations # 0.004 M/sec (100.00%)
709,321 page-faults # 0.585 K/sec
2,956,658,594,250 cycles # 2.438 GHz (100.00%)
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
2,397,178,336,412 instructions # 0.81 insns per cycle (100.00%)
542,664,260,703 branches # 447.442 M/sec (100.00%)
3,346,269,384 branch-misses # 0.62% of all branches
15.691803125 seconds time elapsed
フィールド説明:
task-clock:タスクが実際に使用したプロセッサ時間。単位はmsです。
context-switches : コンテキストスイッチングの回数。
CPUs utilized:CPU利用率。CPU utilized = task-clock / time elapsed。
cpu-migrations:プロセッサのマイグレーション回数。Linuxは複数のプロセッサで負荷分散を維持するため、特定の条件下でタスクをあるCPUから別のCPUに移動します。
page-faults:ページフォールトの回数。
cycles:消費したプロセッササイクル数。CPUサイクルとは、CPUが認識できる最小の時間単位です。
instructions:実行された命令数。
insns per cycle:平均して各CPUサイクルで実行された命令数。
branches:遭遇した分岐命令数。
branch-misses:予測誤りの分岐命令数。
time elapsed :コマンドの実行時間。
perf list
perf listは、perfがサポートするパフォーマンスイベントを確認するために使用されます。
コマンドライン形式:
perf list [hw | sw | cache | tracepoint | event_glob]
パラメータ説明:
hw:PMUコンポーネントが生成するハードウェアイベントを示します。
sw:カーネルが生成するイベントを示します。
cache:CPU各レベルのキャッシュが生成するイベントを示します。
tracepoint:カーネルベースのftraceであり、カーネル内の静的tracepointがトリガーするイベントを示します。
event_glob:その他のイベントを示します。
perf top
perf topは、パフォーマンスイベント(デフォルトではCPUサイクル)を指定し、最も多くのリソースを消費する関数や命令を表示します。主に、特定のパフォーマンスイベントにおける各関数の使用頻度をリアルタイムで分析し、ホットスポットとなる関数を迅速に特定するために使用されます。これには、アプリケーション関数、モジュール関数、カーネル関数が含まれ、さらにはホットな命令にまで特定できます。
コマンドライン形式:
perf top [-e <EVENT> | --event=EVENT] [<options>]
パラメータ説明:
EVENTの取り得る値は以下の通りです:
- u:ユーザースペースでトリガーされたパフォーマンスイベントを表します。
- k:カーネルステートでトリガーされたパフォーマンスイベントを表します。
- h:ハイパーバイザーが生成したパフォーマンスイベントを表します。
- G:KVM仮想マシン上のクライアントが生成したパフォーマンスイベントを表します。
- H:KVM仮想マシン上のホストが生成したパフォーマンスイベントを表します。
optionsの取り得る値は以下の通りです:
- -p
:プロセスIDを指定します。 - -K:カーネルまたはモジュールに属するシンボルを表示しません。
- -U:ユーザーステートプログラムに属するシンボルを表示しません。
- -d
:画面の更新間隔です。デフォルトは2秒です。これは、perf topがデフォルトで2秒ごとにmmapされたメモリ領域からパフォーマンスデータを読み取るためです。 - -G:関数の呼び出し関係図を取得します。
- --call-graph:dwarfスタック戻りに必要なすべての情報(コンパイル時にデバッグ情報-gを追加する必要があります)。
- -p
perf topコマンドを使用して、パフォーマンスイベント内で最も多くのリソースを消費する関数や命令を明示的に指定します。例:
$perf top
Samples: 366K of event 'cycles', Event count (approx.): 23340587417
Overhead Shared Object Symbol
10.40% [vdso] [.] __vdso_gettimeofday
4.70% observer [.] oceanbase::storage::ObPartitionGroupIterator::get_next
4.23% observer [.] oceanbase::common::ObLatch::unlock
4.02% observer [.] oceanbase::common::ObLatch::rdlock
3.08% observer [.] oceanbase::common::ObLatch::wrlock
2.26% observer [.] oceanbase::common::ObLinearHashMap<oceanbase::clog::ObPartitionLogInfo, oceanbase::clog::ObLogCursorExt, ocea
1.97% observer [.] oceanbase::memtable::ObLockWaitMgr::check_timeout
1.82% observer [.] oceanbase::common::hash::ObPreAllocLinkHashMap<oceanbase::storage::ObITable::TableKey, oceanbase::storage::Ob
1.68% observer [.] oceanbase::omt::ObThWorker::worker
フィールド説明:
Overhead:シンボルが引き起こしたパフォーマンスイベントの割合です。デフォルトでは、使用したCPUサイクルの割合を指します。
Shared Object:シンボルが存在するDSO(Dynamic Shared Object)です。アプリケーション、カーネル、動的リンクライブラリ、モジュールが該当します。
Symbol:DSOのタイプとシンボル名です。DSOのタイプについて:[ . ]はこのシンボルがユーザーステートのELFファイルに属することを示します。実行ファイルと動的リンクライブラリが含まれます。[ k ]はこのシンボルがカーネルまたはモジュールに属することを示します。シンボル名について:一部のシンボルは関数名として解決できず、アドレスでのみ表現できます。
vmstat
vmstatはVirtual Memory Statisticsの略であり、オペレーティングシステムの仮想メモリ、プロセス、CPUアクティビティを監視するために使用されます。
コマンドライン形式:
vmstat [-a] [delay [count]] [<options>]
パラメータ説明:
-a:アクティブメモリと非アクティブメモリを表示します。
delay :1回の更新間隔を表します。
count:更新回数を表します。
options:その他の表示可能なパフォーマンス指標を表します。
vmstat 10 2 コマンドを使用して、オペレーティングシステムの仮想メモリ、プロセス、CPUアクティビティを表示します。例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
28 0 0 415902272 283432 201305696 0 0 387 1054 0 0 19 3 78 0 0
38 0 0 415039424 283432 201309824 0 0 907308 1009947 211462 242965 31 2 67 0 0
最初の値は現在のシステム値、2番目の値は10秒間の平均値です。
フィールド説明:
Procs
- r:実行中およびCPUタイムスライスを待機中のプロセス数を表します。
- b:リソース(例:I/Oプロセス)を待機中のプロセス数を表します。
説明
各CPUコアには実行時キューがあり、CPUがプロセスにサービスを提供する際、プロセスはまず実行時キューに入り、CPUからCPU時間を割り当てられるのを待機します。実行キューには、runnable processとblocked processが含まれます。
Memory
- swpd:swapに切り替えられたメモリ量、単位はKBです。
- free:空き物理メモリ。
- buff:キャッシュされたメモリ。一般的にブロックデバイスの読み書きキャッシュです。
- cache:メモリキャッシュ。頻繁にアクセスされるファイルはキャッシュされます。キャッシュ値が大きい場合、キャッシュされた量が多く、ディスクへのアクセスは相対的に少ないことを意味し、ファイルシステムの効率が向上しています。
- inact:非アクティブメモリサイズ。-aオプションを指定した場合に表示されます。
- active:アクティブメモリサイズ。-aオプションを指定した場合に表示されます。
Swap
- si: ディスクからメモリに読み込まれた、メモリ交換領域に入ったデータ量。
- so: メモリ交換領域からディスクに書き出されたデータ量。
これら2項目がどちらも0より大きい場合は注意が必要です。システムメモリが不足していることを示しています。
io
- bi:1秒あたりのディスクブロック読み取り速度。
- bo:1秒あたりのディスクブロック書き込み速度。
ディスクの指標を追跡し、I/O待ちによるCPU時間占有率を参考にしてシステムのI/O性能ボトルネックを評価します。
System
- in: 1秒あたりの割り込み数。
- cs: 1秒あたりのコンテキストスイッチオーバー回数。
これら2つの値が大きいほど、スレッドがCPU時間を消費していることを示します。通常、コンテキストスイッチオーバーの回数はクロック割り込みの回数より少ないはずです。コンテキストスイッチオーバーの回数がクロック割り込みの回数を上回る場合、この負荷はシステムが多くのI/Oを処理する必要があるか、長時間にわたる高負荷のシステムコールによって引き起こされている可能性があります。
CPU
- us:ユーザープロセスのCPU時間消費割合。
- sy:カーネルプロセスのCPU消費割合。
- id:アイドルCPUの割合。
- wa:I/O待ちによるCPU時間占有率。
- st:仮想マシンの占有時間。