背景
Tracepoints
Tracepoint 是散落在内核源代码中的一些 hook,一旦使能,它们便可以在特定的代码被运行到时被触发,这一特性可以被各种trace/debug 工具所使用。Perf 就是该特性的用户之一。
假如您想知道在应用程序运行期间,内核内存管理模块的行为,便可以利用潜伏在 slab 分配器中的 tracepoint。当内核运行到这些tracepoint 时,便会通知 perf。
Perf 将 tracepoint产生的事件记录下来,生成报告,通过分析这些报告,调优人员便可以了解程序运行时期内核的种种细节,对性能症状作出更准确的诊断。
perf使用
perf list
列出所有能够触发 perf 采样点的事件。
能够触发采样的事件大致可以分为三类:
Hardware Event 是由 PMU 硬件产生的事件,比如 cache命中,当您需要了解程序对硬件特性的使用情况时,便需要对这些事件进行采样。
Software Event 是内核软件产生的事件,比如进程切换,tick (tick是系统的相对时间单位,也称为系统的时基,来源于定时器的周期性中断)数等 。
Tracepoint event 是内核中的静态 tracepoint 所触发的事件,这些 tracepoint用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。
perf stat
perf stat ./t1
我们对可执行文件t1进行性能分析
task-clock:用于执行程序的CPU时间,单位是ms(毫秒)。第二列中的CPU utillized则是指这个进程在运行perf的这段时间内的CPU利用率,该数值是由task-clock除以最后一行的time elapsed(也就是wall time,真实时间,单位为秒,下面的M/sec等数值都是除以这个数得到的)再除以1000得出的。
context-switches:程序在运行过程中发生的上下文切换次数。
cpu-migrations:程序在运行过程中发生的CPU迁移次数,即被调度器从一个CPU转移到另外一个CPU上运行。(发生cpu切换一定会发生上下文切换,反之则不对)
page-faults:缺页。指当内存访问时先根据进程虚拟地址空间中的虚拟地址通过MMU查找该内存页在物理内存的映射,没有找到该映射,则发生缺页,然后通过CPU中断调用处理函数,从物理内存中读取。
cycles:CPU时钟周期。CPU从它的指令集(instruction set)中选择指令执行。
instructions:该进程在这段时间内完成的CPU指令。
branches:这段时间内发生分支预测的次数。
branches-misses:这段时间内分支预测失败的次数,这个值越小越好。
perf Top
用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。
perf top -e cpu-clock: 查看CPU的使用
perf top -e faults : 查看 page faults
perf top -e block:block_rq_issue :
查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常。 block_rq_issue
表示 block_request_issue 就是IO请求数。
perf record
perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。
tracepoint
当 perf 根据 tick 时间点进行采样后,人们便能够得到内核代码中的 hot spot.
下面使用sys_enter 这个tracepoint来显示ls的系统调用的次数,我们首先通过stat
为了统计更详细的信息,我们可以通过record+report命令
perf probe
tracepoint是作为静态检查点来考虑的,但是检查点是非常有限的,所以有时候我们想动态的插入一些检查点。
Perf sched
Perf sched 有五个子命令,一般用来衡量调度器的性能。
perf sched record # low-overhead recording of arbitrary workloads
perf sched latency # output per task latency metrics
perf sched map # show summary/map of context-switching
perf sched trace # output finegrained trace
perf sched replay # replay a captured workload using simlated threads
一般使用’ perf sched record ’收集调度相关的数据,然后就可以用’ perf sched latency ’查看诸如调度延迟等和调度器相关的统计数据,其他三个命令也同样读取 record 收集到的数据并从其他不同的角度来展示这些数据。
Map 的好处在于提供了一个的总的视图,将成百上千的调度事件进行总结,显示了系统任务在 CPU 之间的分布,假如有不好的调度迁移,比如一个任务没有被及时迁移到 idle 的 CPU 却被迁移到其他忙碌的 CPU,类似这种调度器的问题可以从map 的报告中一眼看出来。
Perf replay 这个工具更是专门为调度器开发人员所设计,它试图重放 perf.data 文件中所记录的调度场景。很多情况下,一般用户假如发现调度器的奇怪行为,他们也无法准确说明发生该情形的场景,或者一些测试场景不容易再次重现,或者仅仅是出于“偷懒”的目的,使用perf replay,perf 将模拟 perf.data中的场景,无需开发人员花费很多的时间去重现过去,这尤其利于调试过程,因为需要一而再,再而三地重复新的修改是否能改善原始的调度场景所发现的问题。