目录
0. 引言
本文介绍了如何在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上的安装
参考以下资源:
与参考文章不同之处:
需要使用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
命令安装。
2. perf使用介绍(查找CPU热点函数)
性能调优时,我们通常需要分析程序中CPU占用高的热点代码片段,这时需要使用perf record
记录函数级别的统计信息,并使用perf report
显示统计结果。
主要使用的两个指令:
perf record
perf report
2.1 获取XXX进程的perf数据
首先启动XXX进程,使用ps -ef | grep XXX
查看进程号。
执行以下命令记录性能数据:
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
指定要查看的文件。
例如,诊断XXX进程时,report结果如下:
sudo perf report -i perf.data
可以看到crc32_do
函数使用CPU 20.58%。
2.2 使用火焰图
火焰图下载仓库地址:GitHub - brendangregg/FlameGraph
下载火焰图工程代码,并添加至Linux系统环境变量,如/opt/FlameGraph
。
基于perf运行火焰图脚本需要root权限。
On-CPU火焰图生成脚本
#!/bin/bash
export PATH=/tmp:$PATH
rm -f perf.*
ppid=`ps -ef | grep "XXX" | grep -v "grep" | awk '{print $2}'`
if [[ -z "${ppid}" ]]; then
echo "XXX 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
Off-CPU火焰图生成脚本
#!/bin/bash
export PATH=$PATH:/opt/FlameGraph
rm -f perf.*
ppid=`ps -ef | grep -i "XXX" | 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
表示按照最大延迟时间大小排序。