Intel PMU高级功能

Posted by Fei Wu on January 30, 2024

Processor Event-Based Sampling (PEBS)

  • 解决采样时skid的问题
  • skid源于interrupt和触发event指令的间隔,PEBS不需要中断就能将相应寄存器保存到自己的buffer,从而做到precise
  • 不是所有的event都有precise实现
  • 可以用于检测cache false sharing等

图片来源于easyperf.net

PEBS

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

PT encoding

使用场景

  • 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时候之前的路径

引用