本文说明如何搭配perf创建火焰图。
概述 链接到标题
通常在程序遇到效能问题时,我们想找到到底哪些API在费时间并以此来分析效能问题,现存有很多工具可以得到这些数据,例如oprofile, perf, DTrace,但这些工具产生的分析数据都不是特别直观,本文主要是说明如何使用perf获取这些数据并生成可视化的图形帮助直观的进行分析.
Perf 链接到标题
Perf 是用来进行软件性能分析的工具,一般发行版本的linux可以直接安装perf,对于嵌入式系统需要自己编译
编译 链接到标题
Perf的代码就在linux kernel代码的tools/perf下面,我的平台是arm,使用下面方法编译
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秒
perf record -F 99 -p 1336 -g -- sleep 10
也可以使用下面命令抓取所有的记录
perf record -F 99 -a -g -- sleep 10
抓取完后会产生一个perf.data文件,用下面命令将其转化为可被直接读懂的callstack信息文件 out.perf
perf script > out.perf
使用注意 链接到标题
perf一定要在root用户权限下执行,否则会在perf_event__synthesize_kernel_mmap内出现crash,原因是没有root权限无法拿到kmap->ref_reloc_sym
火焰图 链接到标题
其实一般的情况下使用下面命令也能够看到各个stack之间的调用关系和采样时间
perf report -n --stdio
但还是不易读和分析,于是就有了火焰图工具,该工具用pl脚本读取out.perf,画出各个函数的调用关系和占用时间。
下载 链接到标题
https://github.com/brendangregg/FlameGraph.git
生成火焰图 链接到标题
用下面命令可以生成火焰图
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > test.svg
生成后的结果实例如下(图片来源FlameGraph git),用chrome打开后可以点击查看分析那个函数最费时间。
关于火焰图的使用,可以参考https://github.com/brendangregg/FlameGraph这里不再做详细介绍。
参考 链接到标题
http://www.brendangregg.com/flamegraphs.html https://github.com/brendangregg/FlameGraph