menu

Perf和火焰图

最近有一个客户报过来一个问题,说他们的Xserver变卡了。 通过回溯法,定位是到的commit是enable CLOCK_MONOTONIC

为了搞清楚原因,就得把perf请出来了。Perf record是以采样为原理的,他不能统计cpu的使用率, 但我们可以用他来推测一个程序运行时候的函数时间分布,从而推导出这个程序是不是在高效率的执行。

环境

perf是和你当前内核绑定的,因此需要从内核源码里编译。

交叉编译建议是准备一个chroot的arm环境,可以参考我写在rockchip wiki的cross compile。 进入内核下tools/perf目录编译,完后把perf拷进板子就可以了。

编完后把perf文件拷到板子下

sudo apt-get install gcc build-essential flex zlib1g-dev bison libunwind-dev libbfd-dev libdw-dev libelf-dev
make

记得还要装一下你要debug程序的debug符号。

dpkg -i xserver-xorg-core-dbgsym_1.19.3-1_armhf.deb
sudo apt-get install libc6-dbg libgcc1-dbg

实验

在做实验前,先做下面的命令,把cpu频率和gpu频率定频住,保证出来的图不被干扰

echo performance > /sys/devices/platform/ffa30000.gpu/devfreq/ffa30000.gpu/governor
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor

用下面命令测试下perf是否正常工作,以及函数符号是不是能看见

./perf record  -F 99 --call-graph dwarf -a -p $(pidof Xorg) -- sleep 60 
./perf report

实验的设计步骤如下:

  • 进入桌面, 打开terminal和chromium,使用默认size
  • 快速拖动chromium,同时输入./perf record –call-graph dwarf -a -p $(pidof Xorg) – sleep 60

获取火焰图

git clone https://github.com/brendangregg/FlameGraph.git
./perf script | ./FlameGraph/stackcollapse-perf.pl > out.perf-folded
./FlameGraph/flamegraph.pl out.perf-folded > perf-kernel.svg

总结

结果如下, 右键用新tab打开可以zoom:

两次完全没有区别嘛!被耍了,根本就不是这个的影响。

后续其实是一些乱七八糟的编译问题, 确实CLOCK_MONOTONIC对性能有很大影响,因为这个调用频率很高,换CLOCK_MONOTONIC_COARSE后有好转

做为对比,这是待机状态下的:

这还只是其中一个小用法,perf太tm强了。(ง •̀_•́)ง

其实这几个图都不好,xorg里面的stack trace都不完整,其实这是因为程序编译的时候选项fno-omit-frame-pointer没开(用的debian package,设置一下“DEB_CPPFLAGS_MAINT_APPEND”就好了),只能打印当前的指令是在哪个函数内,但不能打印整个调用函数栈。重做出的图如这个,是不是效果要好多了:

See Also

http://www.brendangregg.com/perf.html
http://blog.csdn.net/21cnbao/article/details/78527777?from=singlemessage
http://www.brendangregg.com/flamegraphs.html

顺便研究了下debug symbol的东西,放这里记录下:
http://blog.chinaunix.net/uid-13746440-id-5578048.html

差分: https://linux.cn/article-4670-1.html

直接在图片右上角搜索可以搜函数,不过默认图片太小了,也很难用。。。