使用perf(火焰图)查看热点函数和系统调用最大延迟函数
使用perf(火焰图)查看热点函数和系统调用最大延迟函数
本文介绍了如何在Ubuntu amd64和ARM64平台上安装和使用perf工具进行性能调优,重点讲解了perf工具的安装步骤、查找CPU热点函数的方法,以及使用火焰图进行性能分析的具体操作,帮助开发者更高效地优化系统性能。
1. 安装perf工具
1.1 在Ubuntu amd64上的安装
安装必要的软件包:
sudo apt install linux-source
sudo apt install linux-tools-$(uname -r) # Ubuntu 18.04虚拟机实操可行
1.2 在Ubuntu ARM64上的安装
参考以下资源:
- Nvidia Jetson系列产品安装Perf
- ARM64版本的Ubuntu上安装perf
与参考文章不同之处:
需要使用4.9内核版本的NVIDIA L4T 32.7.1:Jetson Linux R32.7.1 Release Page
因为内核版本为:
可以通过以下步骤查看内核版本:linux系统如何查看内核版本、操作系统版本等信息
建议安装:
sudo apt install linux-source
安装依赖包后,进入
kernel/kernel-4.9/tools/perf
目录并执行
make
,编译器会自动检测并提示缺少的依赖项,这些依赖项可以通过
apt
命令安装。
1.3 手动编译安装
请参考 Linux: 手动编译安装指定内核的perf工具
2. perf使用介绍(查找CPU热点函数)
性能调优时,我们通常需要分析程序中CPU占用高的热点代码片段,这时需要使用
perf record
记录函数级别的统计信息,并使用
perf report
显示统计结果。
主要使用的两个指令:
- perf record
- perf report
2.1 获取进程的perf数据
首先启动进程,使用
ps -ef | grep 进程名
查看进程号。
执行以下命令记录性能数据:
sudo perf record -e cpu-clock -g -p <PID>
其中:
- -g
选项用于记录函数的调用关系 - -e cpu-clock
指定监控的指标为CPU周期 - -p
指定需要记录的进程PID
程序运行完后,
perf record
会生成一个名为
perf.data
的文件,之前的
perf.data
文件会被覆盖。
使用以下命令查看
perf.data
文件:
perf report -i perf.data
其中,
-i
指定要查看的文件。
例如,诊断进程时,report结果如下:
sudo perf report -i perf.data
可以看到
crc32_do
函数使用CPU 20.58%。
2.2 使用火焰图
火焰图下载仓库地址:GitHub - brendangregg/FlameGraph
下载火焰图工程代码,并添加至Linux系统环境变量,如
/opt/FlameGraph
。
参考:arm linux 生成火焰图
基于perf运行火焰图脚本需要root权限。
On-CPU火焰图生成脚本
#!/bin/bash
export PATH=/tmp:$PATH
rm -f perf.*
ppid=`ps -ef | grep "进程名" | grep -v "grep" | awk '{print $2}'`
if [[ -z "${ppid}" ]]; then
echo "进程名 not running"
exit -1
fi
echo "pid is $ppid"
./perf record -F 99 -e cpu-clock -p ${ppid} -g -- sleep 60
./perf script -i perf.data &> perf.unfold
stackcollapse-perf.pl perf.unfold &> perf.folded
flamegraph.pl perf.folded > perf.svg
Off-CPU火焰图生成脚本
#!/bin/bash
export PATH=$PATH:/opt/FlameGraph
rm -f perf.*
ppid=`ps -ef | grep -i "进程名" | grep -v "grep" | awk '{print $2}'`
if [[ -z "${ppid}" ]]; then
echo "app not running"
exit -1
fi
echo "pid is $ppid"
sudo offcputime-bpfcc -df -p ${ppid} 120 > out.stacks # 120s
flamegraph.pl --color=io --title="Off-CPU Time Flame Graph" --countname=us out.stacks > perf_offline.svg
3. 查看系统调用延迟
perf sched latency -s max
用于查看系统调度延迟,具体来说,是查看最大的调度延迟。系统调度延迟是指在操作系统中,从一个任务被触发到它被实际执行之间的时间延迟。
perf sched latency
命令可以解析当前目录下的
perf.data
文件。
-s
表示进行排序,后接参数
max
表示按照最大延迟时间大小排序。
其它参考
C++:perf + Flame Graph火焰图生成