cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平(@inokara)です。
はじめに
サーバー等のパフォーマンスの解析やボトルネックの調査を行うに際して利用するコマンドとしては…
- top
- vmstat
- iostat
- sysstat
等を利用することは多い。これらのコマンドで見当はつけられたりするものの、より細かい(例えばカーネルレベル)レベルで調査したい場合に役に立ちそうなのが perf コマンド。
ということで、早速試してみた。
参考
perf コマンドについて
そもそもなに?
一言で言うと…
- Linux の性能解析ツール
ざっくり出来ることを言うと…
- 実行されるプログラムと OS とのやりとり(イベント)を見ることが出来る
- OS とハードウェアのやりとり(イベント)を見ることが出来る
イベント
取得出来るイベントは下記の通り。
分類 | memo | 例 |
---|---|---|
Hardware event | プロセッサで計測されるイベント | cpu-cycles / cache-misses / bus-cycles 等 |
Software event | カーネルのカウンタで計測されるイベント | cpu-clock / minor-faults / emulation-faults 等 |
Hardware cache event | プロセッサで計測されるイベント | L1-dcache-loads / LLC-loads / branch-load-misses 等 |
Tracepoint event | カーネルの処理を記録する為にカーネルに埋め込まれたトレースポイント | ext4:ext4_free_inode / ext4:ext4_mb_discard_preallocations / kmem:kmalloc 等 |
イベントの一覧については perf list にて取得することが出来る。また、環境に応じて取得出来るイベントは異なるので注意する。
サブコマンド
以下のような代表的なサブコマンドを合わせて利用する。
- stat → プログラムやある時点のシステムのトータルイベントカウントを計測する
- top → top ライクな関数の動的表示
- record → 一つのプログラムのイベントをサンプリングして保存する
- report → perf record によって生成されたファイルを分析する
- list → 利用可能なイベントを一覧する
上記意外にも幾つかのサブコマンドがある。(以下の「おまけ」を参照)
試す
試した環境
- Amazon EC2 の CentOS 6.5 x86_64
インストール
標準のパッケージに含まれているので下記のようにインストール。
yum -y install perf
簡単。
perf top
インストール直後、perf top を実行すると…以下のように top ライクな画面が表示される。
一番頑張っているのは、やっぱ kernel なんですな。
perf list
perf で取得出来るイベントの一覧を取得することが出来る。ここで取得出来る名前がイベント指定時の名前になる。
イベントに関しては -e コマンドで指定する。以下、例。
perf stat -e cpu-clock test.sh
perf stat
コマンドを指定して実行すると、コマンドのパフォーマンスカウンタを確認することが出来る。
試しに上記で利用した test.sh を改めて利用してみると…
perf stat test.sh
下記のように表示された。(※もちろん無限ループとなるので Ctrl+c あたりで停止させる)
a
^Ctest.sh: Interrupt
Performance counter stats for 'test.sh':
1854.979048 task-clock # 0.925 CPUs utilized
2,014 context-switches # 0.001 M/sec
0 cpu-migrations # 0.000 K/sec
342 page-faults # 0.184 K/sec
cycles
stalled-cycles-frontend
stalled-cycles-backend
instructions
branches
branch-misses
2.006052484 seconds time elapsed
上記の結果
- task-clock はコマンドを実行するのに利用した CPU 時間(0.925 CPUs utilized は全体の時間に占める割合)
- context-switches はコンテキストスイッチした回数
- cpu-migrations は別の CPU に移動した回数(シングルコア、シングル CPU の場合には移動のしようがない…)
- page-faults はページフォルトした回数
perf record
perf record は一つのコマンドで発生するイベントをサンプリングする。
先ほどのシェルスクリプトを引数にして以下のように実行すると…
perf record test.sh
カレントディレクトリに perf.data というサンプリングしたファイルが作成される。
perf report
perf.data ファイルが存在するディレクトリにて perf report を実行する。
perf report
以下のように先ほどの test.sh 実行時のイベント情報が表示された。
Sample: 14K と表示されている行の下からが発生したイベントとなるが、このイベントにカーソルを合わせて Enter を叩くと詳細を確認することが出来る。
上図のように hypercall_page にカーソルを合わせて Enter を叩くと…
上図のようなメニューが表示され、選択したイベントに対する各種操作を行うことが出来る。例えば Browse map details を選択して Enter を叩くと…
上図のようにオブジェクトの詳細な情報が表示された。
おお、EC2 インスタンスは Xen ベースとは聞いていたもののこうやって詳細にみると Xen のシステムコールがチラホラ踊っていて、本当に Xen ベースなんだなと実感出来る。
まとめ
perf コマンドとは?
- オーバーヘッドが小さい Linux システムのパフォーマンス解析ツール
どんな時につかうのか?
- あるコマンド(複数のイベントにまたがった)について性能の測定を指定
- 処理のボトルネックの原因を突き止めたい
- システム全体のプロファイリングをしたい(perf top を使えばリアルタイムに行える)
- perf record と perf report を組み合わせることでコマンドの動作について詳細に分析したい
AWS だけではなく Linux 環境においてシステムのボトルネック調査やパフォーマンスチューニングを行う際に利用するツールの一つとして覚えておきたいかなと。
おまけ
perf の man
man ページも非常にシンプル。
PERF(1) perf Manual PERF(1)
NAME
perf - Performance analysis tools for Linux
SYNOPSIS
perf [--version] [--help] COMMAND [ARGS]
DESCRIPTION
Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things performance analysis. It covers hardware level
(CPU/PMU, Performance Monitoring Unit) features and software features (software counters, tracepoints) as well.
SEE ALSO
perf-stat(1), perf-top(1), perf-record(1), perf-report(1), perf-list(1)
perf 05/08/2014 PERF(1)
perf のヘルプ
以下のようなオプションが揃っている。
usage: perf [--version] [--help] COMMAND [ARGS]
The most commonly used perf commands are:
annotate Read perf.data (created by perf record) and display annotated code
archive Create archive with object files with build-ids found in perf.data file
bench General framework for benchmark suites
buildid-cache Manage build-id cache.
buildid-list List the buildids in a perf.data file
diff Read two perf.data files and display the differential profile
evlist List the event names in a perf.data file
inject Filter to augment the events stream with additional information
kmem Tool to trace/measure kernel memory(slab) properties
kvm Tool to trace/measure kvm guest os
list List all symbolic event types
lock Analyze lock events
record Run a command and record its profile into perf.data
report Read perf.data (created by perf record) and display the profile
sched Tool to trace/measure scheduler properties (latencies)
script Read perf.data (created by perf record) and display trace output
stat Run a command and gather performance counter statistics
test Runs sanity tests.
timechart Tool to visualize total system behavior during a workload
top System profiling tool.
trace strace inspired tool
probe Define new dynamic tracepoints
See 'perf help COMMAND' for more information on a specific command.
おまけ(2)
その筋の識者に聞いたことなど。
CPU 使用率とは
- 単位時間と単位時間あたりに CPU が使用された時間の割合(あるいは、それに基づく値)
- CPU 内部リソース(キャッシュ等)の使用状況等は無関係
- 瞬間的な CPU 使用率とか存在しない
CloudWatch による CPU 使用率
- インスタンスの負荷状況にかかわらず CPU 使用率を取得出来るのは嬉しい
- でも、以下のような注意点がある
- 使用率の内訳は取得出来ない
- VCPU 数は関係なくなる
- VCPU の番号がわからない
Linux の CPU 使用率
- /proc/stat に基づいて計算
- システム起動時からの各種処理の累計時間が格納されていて、それらの差分を以って CPU 使用率としている
- AWS では CloudWatch との併用が効果的
- 注意点
- 厳密かつ正確な値にはならない
- 高負荷時に正常な値が取得出来ないこともある
元記事は、こちら