`perf`(Performance analysis tools for Linux)是Linux官方的性能分析器,它存在于内核源码目录的tools/perf中,原名为Linux性能计数器(Performance Counters for Linux,PCL),现名为Linux性能事件(Linux Performance Events,LPE)
作为Linux内核自带的系统性能优化工具,`perf`凭借其强大的功能和与内核的紧密结合,成为了开发者们不可或缺的利器
一、perf的安装与基础使用 在大多数Linux发行版中,`perf`是内核的一部分,但需要通过软件包管理器进行安装
安装命令因发行版的不同而有所差异: Debian/Ubuntu: bash sudo apt update sudo apt install linux-tools-common linux-tools-$(uname -r) Fedora/RHEL/CentOS: bash sudo dnf install perf Arch Linux: bash sudo pacman -S perf 安装完成后,可以通过运行`perf --version`来确认`perf`是否安装成功
`perf`提供了许多子命令,每个子命令都专注于特定的性能分析任务
以下是一些常见的用法: 1.分析CPU使用情况(perf stat): `perf stat`用于统计一个命令的执行过程中,硬件和软件事件发生的次数
例如,可以用它来查看程序执行期间的CPU周期、指令、缓存访问等硬件计数
bash perf stat ls 输出将包括程序执行期间的事件统计信息,如CPU周期、指令数、缓存未命中次数和分支未命中次数等
2.查看程序的热点函数(perf record和`perf report`): `perf record`用于记录程序的性能数据,特别是CPU性能数据(如函数的执行频率)
`perf report`则用于分析这些数据,查看程序的热点函数
bash perf record ./my_program perf report 这将记录`my_program`的执行数据,并生成一个`perf.data`文件
然后,`perfreport`会打开一个文本用户界面(TUI),显示执行数据的分析报告,包括各个函数的执行频率(如CPU周期占比),帮助识别程序的热点函数
3.分析系统上的所有进程(perf top): `perf top`类似于`top`,但它分析的是系统上所有进程的实时性能数据,显示当前占用CPU最多的函数或事件
这有助于了解哪些程序或函数正在消耗最多的系统资源
4.跟踪系统调用(perf trace): `perf trace`是一个类似于`strace`的工具,它可以跟踪进程的系统调用并统计其频率和开销
例如,跟踪`ls`命令的系统调用: bash perf trace ls 输出将显示`ls`过程中发生的所有系统调用及其耗时
5.分析内核事件(perf sched): `perf sched`可以用来分析内核中的调度事件,了解进程的调度行为,分析系统中是否存在调度延迟等问题
二、perf的高级用法与性能调优 除了基本用法外,`perf`还支持许多高级功能,这些功能在性能调优中尤为重要
1.采样指定硬件事件: `perf`可以专门采样某些硬件事件(例如缓存未命中、分支预测失败等),从而针对性地分析程序的性能问题
例如,记录程序的缓存未命中情况: bash perf record -e cache-misses ./my_program 这将记录程序执行期间的缓存未命中次数,有助于分析缓存性能问题
2.对指定PID进行性能分析: 如果想对正在运行的某个进程进行性能分析,可以使用`-p`选项指定进程ID
这对分析后台运行的进程非常有用
bash
perf record -p 例如:
bash
perf sched record
perf sched latency
通过分析调度延迟,可以找出导致系统调度不均衡的原因
4.程序性能瓶颈分析:
在发现一个程序的执行时间比预期长时,可以使用`perfrecord`和`perf report`来分析程序的性能瓶颈 通过分析函数的CPU使用情况,找出最耗时的部分,进而进行优化
5.CPU资源争用分析:
当系统负载较高时,可以使用`perftop`查看哪些进程或者函数占用了最多的CPU资源 这有助于定位系统性能瓶颈,分析高CPU占用的原因
三、perf的优势与局限性
`perf`作为Linux内核自带的性能分析工具,具有显著的优势:
- 性能消耗小:perf在采样和分析过程中,对系统性能的影响较小,能够确保分析的准确性
- 生成文件小:perf生成的性能数据文件相对较小,便于存储和传输
- report速度快:perf的分析报告生成速度快,能够迅速提供性能问题的关键信息
- 与内核紧密结合:perf能够最先应用到加入内核的新特性,确保与内核的兼容性
然而,`perf`也存在一些局限性:
- 不遵守X86 Calling Convention的函数无法获取堆栈信息:对于某些特定的函数,perf可能无法获取完整的堆栈信息
- 内联函数无法获取堆栈信息:对于内联函数,`perf`同样可能无法获取堆栈信息,这会影响分析的准确性
- 需要处理器支持:perf的某些功能需要处理器的支持,如果处理器不支持,则无法使用这些功能
此外,在使用`perf`时,还需要注意一些常见问题 例如,非root用户运行`perf`时,可能会出现内存映射页面大小超过系统限制的问题 此时,可以通过调整`/proc/sys/kernel/perf_event_mlock_kb`的值来解决
四、总结
`perf`是Linux内核中强大的性能分析工具,能够对CPU事件、系统调用、线程调度、硬件计数器等多种系统层面进行全面的性能分析 通过掌握`perf`的基本用法和高