perf-tools

Perf tools是由内核维护人员Ingo Molnar等人开发的linux内核的综合性能该要分析工具。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。

环境

OS

ubuntu 16.04.5 LTS

Kernel

1
2
$ uname -a
Linux ubuntu-linux 4.4.0-138-generic #164-Ubuntu SMP Tue Oct 2 17:16:02 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

安装

perf的安装可以分成两种,一种是package安装法;

1
sudo apt install linux-tools-common linux-tools-4.4.0-138-generic

另一种安装方法是源码安装,这种方法需要先下载当前内核对应的源代码,

1
2
# 下载 4.4.0-138 源码
sudo apt-get install linux-source=4.4.0.138.144

然后进入/usr/src目录中的源代码目录下,找到tools/perf目录,并在该目录下执行make编译perf源码,再执行make install安装perf

perf使用姿势

姿势一

选择分析的事件

通过perf list列出可以选择的分析事件

概要分析数据

使用perf topperf stat进行该要分析系统性能,perf top类似于linux的top命令,按进程显示分析数据,可以使用-e参数指定分析事件,通过perf top找出系统中的问题进程。(更多关于perf top的使用精请见perf top -h

perf stat用于汇总综合性能,有人用此方法比较性能改善前后的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Performance counter stats for 'ls /':
0.827614 task-clock (msec) # 0.707 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
91 page-faults # 0.110 M/sec
<not supported> cycles
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
<not supported> instructions
<not supported> branches
<not supported> branch-misses
0.001169835 seconds time elapsed

(由于我使用的是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脚本) or perf script -g python(python脚本)生成自定义脚本,根据需要修改生成的脚本内容
  • 执行自定义脚本
    使用perf script+-s参数指定用户自定义的脚本执行追踪处理

姿势三

Todo…

perf tools这把瑞士军刀可以说功能齐全威力惊人,但能将其发挥几层还要看使用者的功力如何。

参考&鸣谢