关注+星号公众号,不容错过精彩
作者: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 10
perf 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 1
perf 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
往期推荐