1、安装perf工具
1.1、ubuntu 18.04 x86下的安装
安装sudo apt install linux-source
sudo apt install linux-tools-`uname -r`
# ubuntu 18.04虚拟机实操可行
1.2、ubuntu 18.04 ARM下的安装
-
参考 Nvidia Jetson系列产品安装Perf
-
ARM64版本的Ubuntu上安装perf
与参考文章不同之处:
-
须使用4.9内核版本的NVIDIA L4T 32.7.1:Jetson Linux R32.7.1 Release Page
因为内核ARM机器的内核版本为:
linux系统如何查看内核版本、操作系统版本等信息
-
最好安装
sudo apt install linux-source
-
安装依赖包文件到如此程度
到kernel/kernel-4.9/tools/perf目录下执行make,编译器会自动检测依赖项。缺少的依赖项可通过apt安装。
perf ARM可执行文件和运行脚本已上传,下载路径
2、perf使用介绍(查找CPU热点函数。)
性能调优时,我们通常需要分析查找到程序CPU占比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果;
主要使用到perf的这两个指令
perf record 和 perf report
2.1、获取XXX进程的perf数据:
首先启动XXX进程,使用ps -ef | grep XXX
查看进程号
-
sudo perf record -e cpu-clock -g -p 67925
-g 选项是告诉perf record额外记录函数的调用关系
-e cpu-clock 指perf record监控的指标为cpu周期
-p 指定需要record的进程pid
程序运行完之后,perf record会生成一个名为perf.data的文件,如果之前已有,那么之前的perf.data文件会被覆盖
-
获得这个perf.data文件之后,就需要perf report工具进行查看
perf report -i perf.data
-i 指定要查看的文件
以诊断XXX进程为例,report结果:
$sudo perf report -i perf.data
可以看到crc32_do
函数使用cpu 20.58%
2.2、使用火焰图
-
火焰图下载仓库地址:编辑GitHub - brendangregg/FlameGraph: Stack trace visualizer
-
下载火焰图工程代码,并添加至Linux系统环境变量,如
/opt/FlameGraph
-
使用参考 arm linux 生成火焰图
-
基于perf运行火焰图脚本,需要root权限
On-CPU生成脚本
#!/bin/bash
export PATH=/tmp:$PATH
rm -f perf.*
ppid=`ps -ef | grep "XXX" | grep -v "grep" | awk '{print $1}'`
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”表示按照最大延迟时间大小排序。
其它参考
C++:perf + Flame Graph火焰图生成