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利用率 = タスク時間 / 経過時間。
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 Meomory 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コアには1つのランタイムキューがあります。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:仮想マシンの占有時間。