linux内存分析工具-perf和火焰图
什么是perf
perf是linux环境下一个性能分析工具,它可以用于在Linux操作系统上进行系统性能分析和调优。它提供了一组命令行工具和API,可以监测系统的各种硬件和软件事件,并收集相关的性能数据。
使用Linux perf,你可以进行以下操作:
性能计数器:perf可以监测CPU的各种硬件性能计数器,如指令执行数、缓存命中率、分支预测情况等,用于分析程序的CPU消耗和性能瓶颈。
Tracepoints:通过在内核和用户空间的关键位置插入tracepoints,perf可以跟踪程序的执行流程,帮助定位性能问题。
基于事件的采样分析:perf可以基于硬件中断或特定事件(如函数调用、指令执行、缓存失效等)发生时进行采样,从而收集到发生这些事件时的调用栈数据,用于分析程序的热点函数和调用关系。
动态追踪:perf可以监测指定的函数或指令,以及它们的参数和返回值,用于对程序进行动态分析和跟踪。
火焰图:利用perf生成的调用栈数据,可以使用专门的工具(如FlameGraph)生成火焰图,直观地展示程序的函数调用关系和消耗情况。
火焰图
火焰图是基于 perf 结果产生的 SVG 图,用来展示 CPU 的调用栈。
工具下载,这些脚本不需要编译
wget https://github.com/brendangregg/FlameGraph/archive/master.zip
unzip master.zip
具体流程
1、在终端中运行perf命令收集程序的性能数据,这将启动perf工具,并以采样方式记录指定进程的函数调用信息。PID 就是对应程序的进程ID
perf record -g -p <pid>
2、运行完程序后,使用perf report命令生成报告,这将生成一个包含性能数据分析结果的报告。
perf report --stdio
3、将报告导出为文本文,这将把perf report的输出保存到perf.data文件中。
perf script > perf.data
4、以下命令使用Flame Graph脚本将perf.data转换成火焰图,这将使用stackcollapse-perf.pl脚本将perf.data转换成折叠文件(perf.folded),然后使用flamegraph.pl脚本将折叠文件转换成火焰图(perf.svg)。
$ stackcollapse-perf.pl perf.data > perf.folded
$ flamegraph.pl perf.folded > perf.svg
5、打开perf.svg文件,即可查看生成的火焰图,分析程序的性能瓶颈和函数调用关系。
结果分析
以下是一个示例:
- 纵轴表示调用栈,每一层都是一个函数,也是其上一层的父函数,最顶部就是采样时正在执行的主函数,调用栈越深,火焰就越高。
- 横轴表示抽样数,并不是表示执行时间。若一个函数的宽度越宽,则表示它被抽到的次数越多,表示该函数占用CPU比例越高,需要优化。
- 所有调用栈会在汇总后,按字母序列排列在横轴上。