Linux性能检测工具perf工作原理
perf是一个面向事件(event-oriented)的性能检测工具,内置于Linux内核,又称 perf_events
event 可能的来源:
perf 工具有以下四种 event :
-
software events
使用内核的计数器 kernel counters,记录系统级事件。例如上下文切换,page fault等 -
hardware events
使用CPU的 Performance Monitoring Unit (PMU),记录微体系结构(micro-architecture)事件。例如cycle数,指令执行数 instructions retired,L1 cache misses等
PMU是一种寄存器,用于记录指定事件发生的次数(perf stat -e 多个事件用逗号隔开)。使用PMU计数时,会设定 Sample After Value (SAV)。当PMU的值超过SAV,将触发一个硬件中断,中断处理程序可以收集CPU的IP,调用堆栈,PID等信息,并认为这SAV次事件都是由于当前指令造成的。
hardware events 记录的误差可能来自于:
- 超线程共享PMU: 开启超线程后,一个物理核心被虚拟化为两个逻辑核心,但依然共用同一个PMU
- 事件滑行(Hardware Event Skid): 硬件延迟或指令流重排导致记录的IP并没指向真正发生事件的指令
- 多路复用:如果记录的事件种类超过了PMU的数量,会对PMU进行多路(时分)复用
- 中断屏蔽: 用于记录指令的这个中断可能会被其它中断屏蔽掉
详细参考: Understanding How General Exploration Works in Intel® VTune™ Amplifier
-
hardware cache events
一类特别的 hardware events:有 L1 (d/i)cache, LLC(Last Level Cache), (d/i)TLB, branch 事件 -
tracepoint events
使用内核提供的 ftrace 系统调度追踪器
最常用到的命令:
perf stat
: obtain event counts
perf record
: record events for later reporting
perf report
: break down events by process, function, etc.
perf annotate
: annotate assembly or source code with event counts
perf top:
see live event count
perf bench
: run different kernel microbenchmarks
更细节的使用方法可以在上述命令后加-h
查看
参考资料: