前言
perf 是 Linux 系统中的一个强大的性能分析工具,用于收集系统的各种性能数据。这些数据可以是 CPU 时间、硬件事件,如 cache misses,或者内核和用户空间的函数调用。perf 可以用于实时分析(sampling mode)或者统计分析(counting mode)。
安装使用
要使用 perf,确保你的 Linux 发行版已安装了正确的软件包,例如在 Ubuntu 上,你可以运行以下命令来安装它:
sudo apt-get install linux-tools-common
以下是在 C++ 程序上使用 perf 来进行基本的 CPU 性能分析的简单步骤:
-
编译程序:在构建程序时,你需要开启编译器的 -g 参数,这样 perf 工具就可以从可执行文件中获取符号信息。
-
使用 perf record 启动程序:perf record 是 perf 工具的一个子命令,用于收集性能数据。例如:
# 监控未运行的程序
perf record -g ./myprogram -o perf.data
# 监控正在运行的程序 -p参数后面的数字表示待分析的进程的PID(Process ID,进程标识)
perf record -p 678 -g -o perf.data
# 监控整个系统
perf record -F 1000 -a
-a 选项表示全系统采样,perf record -F 1000 -a 这条命令则表示以 1000Hz 的频率对整个系统进行采样。
需要注意的是,如果你的系统是多核的,那么这个频率是针对每一个 CPU 核心的。也就是说,如果系统有4个核心,实际的采样频率将会是设置的频率乘以 CPU 核心数。同时,采样频率过高可能会对系统性能造成影响,甚至导致系统崩溃,因此在设定采样频率时需要谨慎。
这条命令会在程序运行结束后在当前目录下生成一个名为 perf.data 的文件,其中包含了性能分析数据。其次可以加上sleep来去确定采样的时间
- 使用 perf report 查看性能报告:使用 perf report 命令可以生成并显示一个交互式的性能报告。在这个报告中,你可以看到哪些函数在 CPU 上占用了最多的时间。
perf report
perf report 会打开一个交互式界面,其中按照热点消耗告警的次数,从高到低列出了使用 CPU 时间最多的函数。
退出程序,直接ctrl+c
- 解析数据
perf script -i perf.data > perf.unfold
备注:如果在arm设备上,运行perf record。生成的数据perf.data要先利用perf script解析数据,再将perf.unfold来拷贝到台式机上可视化。
- 生成火焰图
./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
./FlameGraph/flamegraph.pl perf.folded > perf.svg
从火焰图可以获得的信息
- 调用栈从下往上,下层为父类,上层为子类。
- 点击父类缩小,点击子类放大。
- 只关注自己实现的函数名,忽略标准库中的函数。
- 总结一下,火焰图的宽度用于比较不同函数或代码路径的性能,而高度用于显示函数调用堆栈的深度。