Processor Event-Based Sampling (PEBS)
- 解决采样时skid的问题
- skid源于interrupt和触发event指令的间隔,PEBS不需要中断就能将相应寄存器保存到自己的buffer,从而做到precise
- 不是所有的event都有precise实现
- 可以用于检测cache false sharing等
图片来源于easyperf.net
Last Branch Record (LBR)
- 通过ring buffer保存last branch record, entry个数有限
- 新的记录覆盖旧的记录,所以还是可以看成是sampling
- 记录包括branch from和to地址,以及其他信息比如timestamp,mispredict
- 根据不同的branch进行filtering
使用场景
- sample hotpath, basic block
- 分析代码执行路径(其实就是branch),为什么会执行到这里
- profiling guided optimization
- 分析branch misprediction的路径
- –call-graph lbr
- 根据timestamp作timed lbr
使用方法
摘自 An introduction to last branch records 以及 Advanced usage of last branch records
1
2
% perf record -b -e cycles:u ./div
% perf report --sort symbol_from,symbol_to --stdio
1
2
% perf record -e cycles:pp -c 1000000 -g -b ./div
% perf report --branch-history --stdio --no-children
1
2
3
4
% gcc -O2 -o program ...
% ocperf.py record -b -e BR_INST_RETIRED.ALL_BRANCHES:p program
% create_gcov --binary=program --profile=perf.data -gcov_version=1
% gcc -fauto-profile -O2 ...
Intel Processor Trace
- 记录所有branch指令,从而能向前推导出程序完整的执行路径
- 采用下图的压缩方法,极大降低数据量,但是数据量依然很大
- 可以加入timestamp
- 类似tracing,而不是使用interrupt进行sampling
使用场景
- Postmortem analysis
- Analyze performance glitches
- Having better accuracy when profiling
- Introspect execution of the program
使用方法
1
2
$ perf record -e intel_pt/cyc=1/u ./a.out
$ perf script --ns --itrace=i1t -F +srcline,+srccode > decoded.dump
还有支持PT的gdb版本,可以方便定位到coredump时候之前的路径