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

目录

0. 引言

1. 安装perf工具

1.1 在Ubuntu amd64上的安装

1.2 在Ubuntu ARM64上的安装

2. perf使用介绍(查找CPU热点函数)

2.1 获取XXX进程的perf数据

2.2 使用火焰图

On-CPU火焰图生成脚本

Off-CPU火焰图生成脚本

3. 查看系统调用延迟

其它参考


0. 引言

本文介绍了如何在Ubuntu amd64和ARM64平台上安装和使用perf工具进行性能调优,重点讲解了perf工具的安装步骤、查找CPU热点函数的方法,以及使用火焰图进行性能分析的具体操作,帮助开发者更高效地优化系统性能。

1. 安装perf工具

1.1 在Ubuntu amd64上的安装

  1. 安装必要的软件包:

    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

参考: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 $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表示按照最大延迟时间大小排序。

其它参考

C++:perf + Flame Graph火焰图生成

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值