掌握性能分析工具Perf(一)

文摘   2024-10-21 20:42   广东  

关注+星号公众号,不容错过精彩

作者:HywelStar

在作为一个嵌入式软件工程师中,置身于Linux 当中,无论在在做系统方面还是应用方面,满足了基本功能需求,后期还需要去考量性能方面的问题,需要考虑自身添加的部分是否带来一些隐患,或者起到一定的优化,结构代码设计是合理等。

对于性能分析工具目前有很多种如下图,做过性能分析都看过这张图,本章节主要介绍Perf工具;

1. Perf 工具介绍

Perf(Performance Analysis Tools for Linux)是一个功能强大且灵活的性能分析工具,主要用于 Linux 系统中的性能调优和分析。它能够帮助开发者深入了解系统和应用程序的性能瓶颈,并提供详细的分析报告。作为嵌入式软件工程师,掌握和使用 Perf 工具可以显著提升开发效率和产品性能。

Perf 主要包含两个部分:

  • perf 命令,用户空间的应用程序
  • perf_events ,Linux 内核中的一个子系统

perf 命令

Perf 命令是一个用户空间工具,具备 profiling、tracing 和脚本编写等多种功能,是内核子系统 perf_events 的前端工具。通过 perf 命令,用户可以设置和操作内核子系统 perf_events,完成系统性能数据的收集和分析。

perf_events 子系统:

内核子系统 perf_events 提供了性能计数器(hardware performance counters)和性能事件的支持。它采用事件驱动的方式,通过收集特定事件(如 CPU 时钟周期、缓存未命中等)来跟踪和分析系统性能。perf_events 于 2009 年被合并到 Linux 内核源代码中,成为内核的一个子系统。


1.1 Perf 工作原理

Perf 工具依赖于硬件性能计数器(Performance Monitoring Unit, PMU),这些计数器存在于现代 CPU 中,用于跟踪和记录各种硬件事件,如 CPU 周期、缓存命中/未命中、分支预测命中/未命中等。

工作过程:

  • 用户通过输入perf命令进行设置相关的需要的时间类型;
  • perf 定制读取计数器的值,获取采用数据,并将存放在ring bufferr中;
  • 用户通过perf report 和 perf script 从ring buffer 中读取数据生成分析报告。

perf工具是一个功能强大且灵活的性能分析工具。它提供了多种功能。首先,perf可以用于收集各种系统性能数据,包括CPU利用率、内存使用情况、磁盘IO、网络传输等等。通过收集和分析这些数据,可以了解系统的瓶颈和性能瓶颈,并针对性地进行优化。

1.2 Perf 工具基本功能

事件采集:Perf 能够捕获各种硬件和软件事件,包括 CPU 周期、缓存命中/未命中、中断、系统调用等。

统计分析:对采集到的事件进行统计分析,生成性能报告。

热点分析:通过分析程序执行中的热点代码,定位性能瓶颈。

跟踪和测量:可以对系统调用、上下文切换、任务调度等进行详细跟踪和测量。

火焰图:生成可视化的火焰图,帮助开发者直观地理解性能问题。

2. Perf 安装和基本使用

在ubuntu 系统直接安装命既可:

sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

假如是在嵌入式设备中,需要内核配置支持:

CONFIG_PERF_EVENTS=y

命令结构:

perf <command> [options] [arguments]


常用的命令语法:

#perf stat

2.1 perf list

perf list 该命令列出特定机器上可用的性能事件。不同电脑配置可能存在不一样的差异。

perf list# 硬件事件perf list hw# 软件事件perf list sw

事件类型一般有三种:

  • Hardware events:硬件事件是直接由处理器性能监视单元(PMU)提供的数据,通常用于分析处理器内部行为,比如L2 缓存命令等;
  • Software events :软件事件由内核提供,用于跟踪操作系统级别的活动。
  • Hardware cache events:这些事件专门用于分析不同层次缓存的性能。
  • Kernel PMU events :内核 PMU 事件由内核性能监视单元提供,专用于分析内核级别的行为。

2.2 perf probe

perf probe 允许用户动态地向正在运行的内核或用户空间应用程序中插入探针(probe)。这些探针可以用于监控特定函数的调用,记录函数的参数值和返回值等,用于性能分析和调试。perf probe 可以帮助开发人员深入了解程序的运行行为,从而识别和优化性能瓶颈。

perf probe [<options>] <probe-point> [<probe-point> ...]
# 例子:添加一个探针,在do_sys_open入口插入一个perf probe do_sys_open# 带参数的探针perf probe 'do_sys_open filename'
# 查看已经添加的探针perf probe -l
# 删除探针perf probe -d do_sys_open
# 使用探针进行性能分析# 例子:在系统运行 10 秒钟内记录 do_sys_open 函数的调用,并生成一份性能报告perf record -e probe:do_sys_open -aR sleep 10perf report

2.3 perf stat

perf stat 命令执行指定的命令,对命令执行期间发生的硬件和软件事件进行持续计数,并生成这些计数的统计数据。

Usage: perf stat [<options>] [<command>]
# 命令perf stat -p <pid>可以采集某一个进程的运行信息perf stat -p 344
# 例子: zero文件读取输入写到空设备中,连续写888888个block:perf stat -B dd if=/dev/zero of=/dev/null count=888888

2.4 perf record/report

perf record 命令进行采集数据,把数据写入数据文件从,后续可以通过perf report命令对数据进行分析。

perf stat 
# 例子:用1000统计频率,统计一个sleep 5秒过程中perf record -a -F 1000 sleep 1perf report

2.5 perf annotate

perf annotate 命令主要读取perf.data文件(由perf record命令创建)并显示注释后的代码。可以去展现源代码和汇编代码的对应关系,帮助开发者找到性能瓶颈和热点代码。

 Usage: perf annotate [<options>]
# 注释汇编代码perf annotate -i perf.data

2.6 perf top

perf top 是一个实时性能监控工具,类似于 top 命令,但专注于性能事件。它能够实时显示系统中消耗 CPU 周期最多的函数和代码段,帮助开发者快速定位性能瓶颈。

perf top [<options>]

# 监控指定进程的性能事件perf top -p 12345
# 监控指定用户的性能事件perf top -u john
# 监控特定事件perf top -e cycles

3. 总结

本章节主要对Perf 的基本定义还有一些功能进行一个了解,主要用于在开发工程中调试,优化有一定的作用,下一个章节将以实际例子进行如何去使用它,分析开发过程中遇到的问题。

参考:

https://www.brendangregg.com/linuxperf.html



往期推荐



掌握Dynamic debug调试

掌握GDB:在Linux 下调试程序

Linux 内核镜像文件种类认识

GNSS篇(五) - GPSD 编译(含交叉编译)详解

嵌入式C语言代码风格简述

嵌入式中优先级反转及其解决方案

探索摄像头MIPI 接口

揭密摄像头DVP接口

认识摄像头模组

模块化代码 - 实例简介

公众号目录指引

 

           
“阅读原文”一起来充电吧!

 


码思途远
一位码农的日常分享,专注嵌入式领域相关知识。
 最新文章