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の利用率、CPUs utilized = task-clock / time elapsed。
cpu-migrations:プロセッサの移行回数、Linuxは複数のプロセッサのロードバランシングを維持するために、特定の条件下であるタスクをあるCPUから別のCPUに移行します。
page-faults:ページフォールト例外の回数。
cycles:消費したプロセッササイクル数、CPUサイクルとはCPUが認識できる最小の時間単位を指します。
instructions:実行された命令の数。
insns per cycle:平均して各cpu cycleで実行された命令の数。
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:ダウンフィールドスタックトレースに必要なすべての情報(コンパイル時にデバッグ情報-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:仮想マシンの占有時間。