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)   使用定点代替浮点,减少位宽。

posted @ 2023-02-14 20:09  墨尔基阿德斯  阅读(227)  评论(0编辑  收藏  举报