perf-火焰图生成
Flame Graph项目位于GitHub上:https://github.com/brendangregg/FlameGraph
用git将其clone下来:git clone https://github.com/brendangregg/FlameGraph.git
如果是想使用火焰图展示系统内的CPU占用分布情况,执行以下四条指令就够了:
(1) 设备端执行如下命令,来监测性能事件,生成记录文件(-e可指定其他事件,-p可指定线程,具体可参考4.1.4章节)。
./perf record -ag
Ctrl+C结束执行后,在当前目录下会生成采样数据perf.data.一般采样在半分钟左右即可。过长可能会导致生成的采样数据过大内存溢出。
(2) 设备端执行如下命令,用perf script工具对perf.data进行解析
./perf script -i perf.data > perf.unfold
(3) 将perf.unfold拷贝到服务器的FlameGraph-master目录,在服务器端执行如下命令,对其中的符号再进行折叠:
./stackcollapse-perf.pl perf.unfold > perf.folded
(4) 在服务器端执行如下命令,最后生成svg图,使用chrome浏览器打开:
./flamegraph.pl perf.folded > perf.svg
火焰图中的颜色没有特别的含义。以cpu-clock事件为例,横轴的长度代表cpu的消耗时间,越长代表占用CPU越高;纵轴代表调用堆栈,可以点击某个色块放大查看。
最下方的横条表示当前采样到的所有事件,其占比定为100%。注意此处并不代表当前系统负荷为100%。假设系统采样到10000个事件(100%),其中A函数被采样到4000次,则A函数占的比值为40%,反应到火焰图上是A函数的宽度占整体宽度的2/5左右。其中B函数被采样到1000次,则A函数占的比值为10%,反应到火焰图上是A函数的宽度占整体宽度的1/10左右。
我们可以着重关注横向宽度最长的部分,来分析是否有优化空间。
附:常用CPU优化策略:
(1) 去除非必要的操作。
(2) 尽可能利用硬件处理器,例如某些平台有专门计算积分图,或是图像缩放的引擎。
(3) 减少cache-miss。
(4) 使用NEON优化代码。
(5) 减少算法复杂度。
(6) 使用定点代替浮点,减少位宽。