Perf和火焰图

Creative Commons
本作品采用知识共享署名

本文说明如何搭配perf创建火焰图。

概述

通常在程序遇到效能问题时,我们想找到到底哪些API在费时间并以此来分析效能问题,现存有很多工具可以得到这些数据,例如oprofile, perf, DTrace,但这些工具产生的分析数据都不是特别直观,本文主要是说明如何使用perf获取这些数据并生成可视化的图形帮助直观的进行分析.

Perf

Perf 是用来进行软件性能分析的工具,一般发行版本的linux可以直接安装perf,对于嵌入式系统需要自己编译

编译

Perf的代码就在linux kernel代码的tools/perf下面,我的平台是arm,使用下面方法编译

1
2
cd tools/
make LDFLAGS=-static ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- DEBUG=1 HAVE_CPLUS_DEMANGLE=1 perf

会在tools/pref下面生成perf

使用

抓取记录,perf record表示记录,-F 99表示每秒99次采样,-p 1336 是针对哪个进程进行抓取,-g表示记录调用栈,sleep 10则是持续10秒

1
perf record -F 99 -p 1336 -g -- sleep 10

也可以使用下面命令抓取所有的记录

1
perf record -F 99 -a -g -- sleep 10

抓取完后会产生一个perf.data文件,用下面命令将其转化为可被直接读懂的callstack信息文件 out.perf

1
perf script > out.perf

使用注意

perf一定要在root用户权限下执行,否则会在perf_event__synthesize_kernel_mmap内出现crash,原因是没有root权限无法拿到kmap->ref_reloc_sym

火焰图

其实一般的情况下使用下面命令也能够看到各个stack之间的调用关系和采样时间

1
perf report -n --stdio

但还是不易读和分析,于是就有了火焰图工具,该工具用pl脚本读取out.perf,画出各个函数的调用关系和占用时间。

下载

1
https://github.com/brendangregg/FlameGraph.git

生成火焰图

用下面命令可以生成火焰图

1
2
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > test.svg

生成后的结果实例如下(图片来源FlameGraph git),用chrome打开后可以点击查看分析那个函数最费时间。
fire
关于火焰图的使用,可以参考https://github.com/brendangregg/FlameGraph这里不再做详细介绍。

参考

http://www.brendangregg.com/flamegraphs.html
https://github.com/brendangregg/FlameGraph