介绍
perf是一款Linux的性能分析工具。Linux性能计数器是一个基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(程序监控单元))功能和软件(软件计数器、tracepoint)功能。通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来分析内核性能,可以帮助全面理解应用程序中的性能瓶颈。使用perf可以分析程序运行期间发生的硬件事件,比如instructions,clock cycles等。也可以分析软件事件,比如page fault 和进程切换。perf的原理就是通过采集感兴趣事件,来分析热点代码和热点函数。
大致架构如下:
perf提供的事件主要有三种:
1.Hardware Event由PMU部件产生,在特定条件下探测性能事件是否发生以及发生的次数。比如cache命中。
2.Software Event是由内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,时钟周期。
3.Tracepoint Event是内核中静态的tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节。
常用命令
perf list
perf list查看当前系统支持的性能事件
perf top
perf top类似top命令,主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数。直接使用perf top是查看当前整个系统的程序性能。
perf -e:指定事件
perf -p:指定进程
perf -g:详细信息
#include <iostream>
#include <x86intrin.h> // 包含 RDTSC 指令的头文件
int a;
void your_function() {
while(1){
a++;
//std::cout<<a;
}
}
int main() {
your_function();
return 0;
}
执行:sudo perf top -g -p 36389
显示:
perf stat
用于输出指定程序的性能统计数据,既可以获取正在运行的程序数据,也可以获取启动程序的数据。
还是上述代码,获取正在运行程序数据
直接获取启动程序的数据:
perf record
perf record会获取profile保存到perf.data中,-p 指定进程,-a 从所有cpu上采集,-e 指定PMU(处理器监控单元) event,默认是cycles:ppp(CPU周期数),-g 启用调用堆栈记录,-F 采样频率
例如:perf record -p pid -a -g -F 99 — sleep 10 采集pid进程以频率99 采集10秒
perf record -g -e cpu-clock ./test 启动程序采集数据
perf script 显示出采样事件,perf report分析record
火焰图生成
- git clone https://github.com/brendangregg/FlameGraph.git 安装FlameGraph脚本
- sudo perf record -F 99 -g –call-graph dwarf — ./your_program
--call-graph dwarf
: 使用 DWARF 调试信息增强调用链准确性。 - sudo perf script > perf.script 生成可读的调用栈数据
- ./FlameGraph/stackcollapse-perf.pl perf.script > perf.folded 使用stackcollapse-perf.pl 脚本处理数据
- ./FlameGraph/flamegraph.pl perf.folded > flame.svg 生成SVG火焰图
- firefox flame.svg # 或使用其他浏览器