专注于快乐的事情

perf使用指南

基本使用

安装

apt install linux-tools-common
apt install linux-tools-4.4.0-47-generic

测试

perf list
显示可采样的事件。如果能够显示,表示安装成功。

perf list miss 进行模糊查询

perf的运行原理

性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。假如一个程序 90% 的时间都花费在函数 foo() 上,那么 90% 的采样点都应该落在函数 foo() 的上下文中。

改变采样的触发条件使得我们可以获得不同的统计数据:

  以时间点 ( 如 tick) 作为事件触发采样便可以获知程序运行时间的分布。

  以 cache miss 事件触发采样便可以知道 cache miss 的分布,即 cache 失效经常发生在哪些程序代码中。如此等等。

perf 事件

使用 perf list 命令可以列出所有能够触发 perf 采样点的事件。

事件分为以下三种:
Hardware Event 是由 PMU 硬件产生的事件,比如 cache 命中,当您需要了解程序对硬件特性的使用情况时,便需要对这些事件进行采样;
Software Event 是内核软件产生的事件,比如进程切换,tick 数等 ;
Tracepoint event 是内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。

用法

Perf stat

perf stat ls

显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Performance counter stats for 'ls':

0.776039 task-clock (msec) # 0.697 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
92 page-faults # 0.119 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.001113814 seconds time elapsed

几个统计值的含义分别如下:

task-clock (msec):CPU利用率,该值越高,说明花费越多时间在CPU计算上而非其它(比如I/O);执行时间为0.776039毫秒,而通过最后一行知道程序整个执行时间为0.001113814秒,所以百分比为0.776039/1.113814=0.697。

context-switches:记录程序在运行过程中发生的进程切换次数,应该避免频繁的进程切换;这里为0次。

CPU-migrations:记录程序在运行过程中发生的CPU迁移次数,即被调度器从一个CPU转移到另外一个 CPU上运行;这里为0次。

page-faults:记录程序在运行过程中发生的缺页中断次数。

cycles:记录执行程序所发费的处理器周期数。
instructions:记录执行程序所发费的指令数。
branches:记录程序在运行过程中的分支指令数。
branch-misses:记录程序在运行过程中的分支预测失败次数。
cache-references:记录程序在运行过程中的cache命中次数。
cache-misses:记录程序在运行过程中的cache失效次数。

统计该应用程序运行期间究竟发生了多少次系统调用。在哪里发生的?
perf stat -e raw_syscalls:sys_enter ls

对整个系统直接进行采样

使用 perf stat 的时候,往往您已经有一个调优的目标。如果只是发现系统性能无端下降,并不清楚究竟哪个进程可以使用
perf top

实时显示当前系统的性能统计信息。

通过-e指定关注的事件,比如如下查看造成context-switches最多的函数排行
perf top -e context-switches

精确制导——定位程序瓶颈,使用 perf record

查找时间上的热点函数

perf record -e raw_syscalls:sys_enter ls
perf report

perf record -e writeback:* ls
perf report

g按照调用关系进行显示的统计信息
e指定关注的事件。

perf record的其他参数:

  -f:强制覆盖产生的.data数据

  -c:事件每发生count次采样一次

  -p:指定进程

  -t:指定线程

参考

https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/
http://www.blogjava.net/qileilove/archive/2013/09/04/403646.html

评论系统未开启,无法评论!