perfでプロファイルを実行する

perfは長期間開発が活発で今更な感がありますが、プロファイルに使ってみた のでメモを残します。

 

1 perfとは

Linux上で動作するプロファイラです。 ハードウェアのパフォーマンスカウンタに対応している為、oprofile等の他 のプロファイラに比べて相当に軽いです。

2 インストール方法

 

2.1 ubuntuの場合

linux-toolsパッケージをインストールします。カーネルの版数に合わせた ものが必要となります。

sudo apt-get install linux-tools-[カーネルの版数]

私の環境では以下でした。

sudo apt-get install linux-tools-3.13.0-24-generic

2.2 centosの場合

perfパッケージをインストールします。

sudo yum install perf

3 使い方

perf [サブコマンド]でプロファイルの実行や閲覧を実現します。 manはperf-[サブコマンド]で閲覧できます(man perf-record等)。

3.1 プロファイルの実行

コマンドを走らせてプロファイルを実行します。コマンド実行後にプロファ イルの結果を保存したperf.dataというファイルが作成されます。

perf record -- [コマンド]

別ファイルに保存する場合は-oオプションで指定します。

perf record -o [ファイル] -- [コマンド]

3.2 プロファイルの閲覧

以下のコマンドでプロファイルの結果を閲覧します。ファイル名を指定しな い場合はperf.dataから結果を読みます。

perf report

ファイル名を指定する場合は-iオプションを使います。

perf report -i [プロファイルのファイル]

上記の場合はncursesベースのビューアで結果を閲覧できますが、–stdioオ プションを指定した場合にはlessライクなビューアで結果を閲覧できます。

perf report --stdio

4 コールグラフの出力

-gオプションを用いてプロファイルを実行します。

perf record -g [コマンド]

-gオプションのmanは以下の通りです。

      -g, --call-graph
          Do call-graph (stack chain/backtrace) recording.

-g -Gを指定して結果を閲覧します。

perf report -g -G

それぞれのmanは以下の通りです。

    -g [type,min,order], --call-graph
        Display call chains using type, min percent threshold and
        order. type can be either:
    -G, --inverted
        alias for inverted caller based call graph.

5 その他

 

5.1 perf-top

topコマンドライクなツールで、関数単位でcpu使用率を閲覧できます (要root権限)。

$ sudo perf top
29.29%  perf                         [.] 0x0000000000050b0e
 6.91%  [kernel]                     [k] kallsyms_expand_symbol.constprop.1
 4.44%  libc-2.15.so                 [.] __strstr_sse2
 3.95%  libc-2.15.so                 [.] __strcmp_sse2
 3.45%  [kernel]                     [k] format_decode
 3.07%  libc-2.15.so                 [.] memchr
 3.00%  [kernel]                     [k] vsnprintf
 2.27%  libc-2.15.so                 [.] __memcpy_sse2
 2.25%  [kernel]                     [k] memcpy
 2.10%  [kernel]                     [k] string.isra.3
 2.06%  libc-2.15.so                 [.] critical_factorization

5.2 perf-stat

コマンド実行時のパフォーマンスカウンタの値を取得します。

$ perf stat [コマンド]
Performance counter stats for '[コマンド]'

         1.271820 task-clock                #    0.118 CPUs utilized
               29 context-switches          #    0.023 M/sec
                0 cpu-migrations            #    0.000 K/sec
              286 page-faults               #    0.225 M/sec
        2,463,690 cycles                    #    1.937
        GHz                     [36.82%]
        1,422,229 stalled-cycles-frontend   #   57.73% frontend cycles idle
        1,093,980 stalled-cycles-backend    #   44.40% backend cycles idle
        1,905,509 instructions              #    0.77  insns per cycle
                                            #    0.75  stalled cycles per insn
          367,270 branches                  #  288.775 M/sec
           16,792 branch-misses             #    4.57% of all
           branches         [65.01%]

      0.010764321 seconds time elapsed

5.3 perf-list

採取可能なイベントを出力します。本サブコマンドで出力されたイベントは他 のサブコマンドの-eオプションで指定できます。

$ perf list

List of pre-defined events (to be used in -e):
  cpu-cycles OR cycles                               [Hardware event]
  instructions                                       [Hardware event]
  cache-references                                   [Hardware event]
  cache-misses                                       [Hardware event]
  branch-instructions OR branches                    [Hardware event]
  branch-misses                                      [Hardware event]
  bus-cycles                                         [Hardware event]
  stalled-cycles-frontend OR idle-cycles-frontend    [Hardware event]
  stalled-cycles-backend OR idle-cycles-backend      [Hardware event]
  ref-cycles                                         [Hardware event]

キャッシュミスの回数を見てみます。

$ perf stat -e cache-misses [コマンド]

Performance counter stats for '[コマンド]':

             5,716 cache-misses

       0.001550605 seconds time elapsed

6 まとめ

性能評価やボトルネック解析にperfは役立つと思います。 動作が軽いので、リファクタリングの際に使うのもありだと思います。