perf-reportめも

Linux 4.5からperf reportのソート方針がちょっと変わっているので忘れないようにメモ。

こんな感じでprobeを設定し、

perf probe -a _do_fork

こうやって実行する。

perf record -e probe:_do_fork -aR sleep 10

そして、perf reportを使った場合、

perf report

カーネル4.4のソースコードに含まれるperfだとこのようになります。

Samples: 9  of event 'probe:_do_fork', Event count (approx.): 9
Overhead  Command          Shared Object     Symbol
  88.89%  bash             [kernel.vmlinux]  [k] _do_fork
  11.11%  tracker-miner-f  [kernel.vmlinux]  [k] _do_fork

カーネル4.5のだとこのように。

Samples: 9  of event 'probe:_do_fork', Event count (approx.): 9
Overhead  Trace output
 100.00%  (ffffffff810

これは↓のpatchからソート方法が変わったためで、今まではSORT_MODENORMALだったと思うんだけど、これがSORT_MODETRACEPOINTが使われるようになりました。

github.com

なので今まで通りに表示をさせたい場合は-sオプションでソート順を指定する必要があります。ソート順はデフォルト値がtools/perf/util/sort.cに書かれていています。

 13 const char      default_sort_order[] = "comm,dso,symbol";
 14 const char      default_branch_sort_order[] = "comm,dso_from,symbol_from,symbol_to,cycles";
 15 const char      default_mem_sort_order[] = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked";
 16 const char      default_top_sort_order[] = "dso,symbol";
 17 const char      default_diff_sort_order[] = "dso,symbol";
 18 const char      default_tracepoint_sort_order[] = "trace";

従来通りのソート順にするならcomm,dso,symbolですね。

sudo ./perf report -i ~/perf.data -s comm,dso,symbol

そうするとこうなります。

Samples: 9  of event 'probe:_do_fork', Event count (approx.): 9
Overhead  Command          Shared Object     Symbol
  88.89%  bash             [kernel.vmlinux]  [k] _do_fork
  11.11%  tracker-miner-f  [kernel.vmlinux]  [k] _do_fork

まおうさんに感謝!

Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック

Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック