Perf tools是由内核维护人员Ingo Molnar等人开发的linux内核的综合性能该要分析工具。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。
环境
** OS **
ubuntu 16.04.5 LTS
** Kernel **
1 | uname -a |
安装
perf的安装可以分成两种,一种是package安装法;
1 | sudo apt install linux-tools-common linux-tools-4.4.0-138-generic |
另一种安装方法是源码安装,这种方法需要先下载当前内核对应的源代码,
1 | 下载 4.4.0-138 源码 |
然后进入/usr/src
目录中的源代码目录下,找到tools/perf
目录,并在该目录下执行make
编译perf源码,再执行make install
安装perf
perf使用姿势
姿势一
选择分析的事件
通过perf list
列出可以选择的分析事件
概要分析数据
使用perf top
和perf stat
进行该要分析系统性能,perf top
类似于linux的top
命令,按进程显示分析数据,可以使用-e
参数指定分析事件,通过perf top
找出系统中的问题进程。(更多关于perf top
的使用精请见perf top -h
)
perf stat
用于汇总综合性能,有人用此方法比较性能改善前后的结果。
1 | Performance counter stats for 'ls /': |
(由于我使用的是VM,所有有很多不支持的)
- task clock
进程执行所花费的时间,CPU 利用率,该值高,说明程序的多数时间花费在 CPU 计算上而非 IO。 - context switches
进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的。 - cpu migrations
进程运行过程中发生了多少次 CPU 迁移,即被调度器从一个 CPU 转移到另外一个 CPU 上运行。 - page faults
按需分页或交换等过程中使用的页面错误的发生次数和频率 - cycles
处理器时钟,一条机器指令可能需要多个 cycles - instructions
机器指令数目 - branches
分支命令的数量和频率 - branch misses
分支预测错误的比例
分析记录的数据
记录并保存分析数据
通过perf record
命令实现将分析数据保存到perf.data
(默认)文件中,虽然perf top
也能获取分析数据,但是perf top
每隔2秒(默认)更新一次,而且对于一些特殊case不好抓取。perf record
特别适合针对某个进程某个事件的分析非常好用。具体使用方法可以参考perf record -h
查看保存的分析数据
通过perf report
查看perf.data
(默认),perf report
分析内容的查看与perf top
的查看方式相同。
姿势二
perf script
一般情况下,我们可以通过perf record
+-e
指定追踪事件方式来获取进程相关事件分析数据(perf.data
),然后通过perf script
(不加任何脚本情况下)只显示记录到的追踪事件数据。若perf script
后指定脚本,那么会将记录到的追踪事件数据作为输入,传递给指定的脚本处理。
perf脚本处理数据分为在线处理和离线处理;
- 在线处理
在进行追踪的同时运行脚本,则不可避免地会增加负载
eg:perf script sctop
统计系统调用次数 - 离线处理
进行离线处理时先追踪后处理,可以抑制处理对追踪对象的影响
eg:perf script record syscall-counts ls /
先追踪,后处理;perf script report syscall-counts
查看统计系统调用次数结果
** 自定义脚本 **
用户可根据自己的需求编写自己的Python或Perl脚本处理追踪事件数据,二者分别需要安装libpython或libperl,并且需要重新build perf。
过程:
- 先记录必要事件的数据文件
使用perf record
记录执行ls /
过程中内存分配kmalloc()的相关事件数据
eg:perf record -e kmem:kmalloc -e raw_syscalls:sys_enter ls /
- 生成自定义脚本
使用perf script -g perl
(perl脚本) orperf script -g python
(python脚本)生成自定义脚本,根据需要修改生成的脚本内容 - 执行自定义脚本
使用perf script
+-s
参数指定用户自定义的脚本执行追踪处理
姿势三
Todo…
收
perf tools这把瑞士军刀可以说功能齐全威力惊人,但能将其发挥几层还要看使用者的功力如何。