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 → プログラムやある時点のシステムのトータルイベントカウントを計測する
  • toptop ライクな関数の動的表示
  • record → 一つのプログラムのイベントをサンプリングして保存する
  • reportperf record によって生成されたファイルを分析する
  • list → 利用可能なイベントを一覧する

上記意外にも幾つかのサブコマンドがある。(以下の「おまけ」を参照)



試す


試した環境

  • Amazon EC2CentOS 6.5 x86_64


インストール

標準のパッケージに含まれているので下記のようにインストール。

yum -y install perf

簡単。


perf top

インストール直後、perf top を実行すると…以下のように top ライクな画面が表示される。

img_perf-analysis-tool_01

一番頑張っているのは、やっぱ kernel なんですな。


perf list

perf で取得出来るイベントの一覧を取得することが出来る。ここで取得出来る名前がイベント指定時の名前になる。

img_perf-analysis-tool_02

イベントに関しては -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 実行時のイベント情報が表示された。

img_perf-analysis-tool_03

Sample: 14K と表示されている行の下からが発生したイベントとなるが、このイベントにカーソルを合わせて Enter を叩くと詳細を確認することが出来る。

img_perf-analysis-tool_04

上図のように hypercall_page にカーソルを合わせて Enter を叩くと…

img_perf-analysis-tool_05

上図のようなメニューが表示され、選択したイベントに対する各種操作を行うことが出来る。例えば Browse map details を選択して Enter を叩くと…

img_perf-analysis-tool_06

上図のようにオブジェクトの詳細な情報が表示された。

おお、EC2 インスタンスは Xen ベースとは聞いていたもののこうやって詳細にみると Xen のシステムコールがチラホラ踊っていて、本当に Xen ベースなんだなと実感出来る。



まとめ


perf コマンドとは?

  • オーバーヘッドが小さい Linux システムのパフォーマンス解析ツール


どんな時につかうのか?

  • あるコマンド(複数のイベントにまたがった)について性能の測定を指定
  • 処理のボトルネックの原因を突き止めたい
  • システム全体のプロファイリングをしたい(perf top を使えばリアルタイムに行える)
  • perf recordperf 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 との併用が効果的
  • 注意点
    • 厳密かつ正確な値にはならない
    • 高負荷時に正常な値が取得出来ないこともある

元記事は、こちら