概述
通常在程序遇到效能问题时,我们想找到到底哪些API在费时间并以此来分析效能问题,现存有很多工具可以得到这些数据,例如oprofile, perf, DTrace,但这些工具产生的分析数据都不是特别直观,本文主要是说明如何使用perf获取这些数据并生成可视化的图形帮助直观的进行分析.
Perf
Perf 是用来进行软件性能分析的工具,一般发行版本的linux可以直接安装perf,对于嵌入式系统需要自己编译
编译
Perf的代码就在linux kernel代码的tools/perf下面,我的平台是arm,使用下面方法编译1
2cd 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.perf1
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打开后可以点击查看分析那个函数最费时间。
关于火焰图的使用,可以参考https://github.com/brendangregg/FlameGraph这里不再做详细介绍。
参考
http://www.brendangregg.com/flamegraphs.html
https://github.com/brendangregg/FlameGraph