Perf_events
所处理的hardware event
(硬件事件)需要CPU
的支持,而目前主流的CPU
基本都包含了PMU
(Performance Monitoring Unit
,性能监控单元)。PMU
用来统计性能相关的参数,像cache
命中率,指令周期等等。由于这些统计工作是硬件完成的,所以CPU
开销很小。
以X86
体系结构为例,PMU
包含了两种MSRs
(Model-Specific Registers
,之所以称之为Model-Specific
,是因为不同model
的CPU
,有些register
是不同的):Performance Event Select Registers
和Performance Monitoring Counters
(PMC
)。当想对某种性能事件(performance event
)进行统计时,需要对Performance Event Select Register
进行设置,统计结果会存在Performance Monitoring Counter
中。
当perf_events
工作在采样模式(sampling
,perf record
命令即工作在这种模式)时,由于采样事件发生时和实际处理采样事件之间有时间上的delay
,以及CPU
流水线和乱序执行等因素,所以得到的指令地址IP
(Instruction Pointer
)并不是当时产生采样事件的IP
,这个称之为skid
。为了改善这种状况,使IP
值更加准确,Intel
使用PEBS
(Precise Event-Based Sampling
),而AMD
则使用IBS
(Instruction-Based Sampling
)。
以PEBS
为例:每次采样事件发生时,会先把采样数据存到一个缓冲区中(PEBS buffer
),当缓冲区内容达到某一值时,再一次性处理,这样可以很好地解决skid
问题。
执行一下perf list --help
命令,会看到下面内容:
The p modifier can be used for specifying how precise the instruction address should be. The p modifier can be specified multiple times:
0 - SAMPLE_IP can have arbitrary skid
1 - SAMPLE_IP must have constant skid
2 - SAMPLE_IP requested to have 0 skid
3 - SAMPLE_IP must have 0 skid
For Intel systems precise event sampling is implemented with PEBS which supports up to precise-level 2.
现在可以理解,经常看到的类似“perf record -e "cpu/mem-loads/pp" -a
”命令中,pp
就是指定IP
精度的。