About perf
从2.6.31版本开始,linux内核开始提供了一个正式接口来管理硬件计数器,这个接口就是通过系统调用“perf_event_open” , 同时内核还提供了一个用户层次的工具来利用这个接口,也就是perf。
perf有两种可用的模式:计数和采样。
计数简单的在整个程序执行的过程中测量发生的事件数目而不会考虑到底是哪些指令或者是哪些函数造成了这些事件的产生。
另一方面,采样通过IP指令指针给出了这个事件的发生和代码本身之间的关系。在采样的过程中,内核告诉CPU上面的PMU,如何选定的事件计数器超过阀值,CPU就发出一个中断,内核捕捉这个中断,然后把采样的数据,包括IP值,存到ring buffer中。这个buffer会由用户空间定义的perf工具来周期性的轮询,并且把它的内容写入到磁盘中。在后续处理中,IP指针会和二进制文件进行映射,从而确定是哪个函数名产生。
About pmu-tools
pmu-tools是一个在perf上面构建的能够提供很多intel特殊的采样功能的工具集。
它并不会替代传统的perf,而是对它做了一些扩展,或者做了一些wrapper从而可以更直接的使用perf。
pmu-tools的下载地址是http://github.com/andikleen/pmu-tools
## pebs-grabber:perf并没有输出PEBS的输出,而这个PEBS的输出其实包含了很多有用的信息。
pebs-grabber从perf中提取PEBS数据,同时这里假设perf的pebs handler已经在运行。我们同时也对这些PEBS数据做trace point。
我们可能需要对内核接口做一些修改,并且在非常老的内核上可能运行的并不好。
下面的程序会创建两个新的trace point。一个是trace_pebs_v1另一个是trace_pebs_v2这会log完整的PEBS record。当CPU支持PEBSv2时【haswell微架构】会有另外的域被pebs_v2记录。
make [KDIR=/my/kernel/build/dir]
insmod pebs-grabber.ko
# needs to record as root
perf record -e cycles:p,pebs_v1,pebs_v2 [command, -a for all etc.]
perf report
perf script to display pebs data
# alternatively trace-cmd and kernelshark can be also used to dump
# the pebs data
引用:
【1】The overhead of profiling using PMU hardware counters
【2】 http://lwn.net/Articles/556983/