问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用perf(火焰图)查看热点函数和系统调用最大延迟函数

创作时间:
作者:
@小白创作中心

使用perf(火焰图)查看热点函数和系统调用最大延迟函数

引用
CSDN
1.
https://blog.csdn.net/stallion5632/article/details/138562957

本文介绍了如何在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火焰图生成

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号