CPU性能优化--skylake 微架构事件编码示例
Event 事件 编码 Umask 掩码值 事件掩码助记符 描述
C0H 00H INST_RETIRED.ANY_P 退休的指令数量
C4H 00H BR_INST_RETIRED 退休的分支跳转指令
linux perf提供常用性能计数器的映射,可以通过映射的事件名称来访问,而不是指定Event 和Umask十六进制值。例如,branches只是BR_INST_RETIRED.ALL_BRANCHES的同义词,可以测量相同的东西,可以通过perf list查看可用的映射名称列表。
perf list
然而,linux perf 并没有为每个CPU架构的所有性能计数器提供映射,如果要找的PMC没有映射,则可以使用如下语法来采集它。
perf stat -e cpu
此外,围绕linux perf还有一些封装工具,可以用来处理映射工作,例如oprofile和ocperf.py 下面是用法
ocperf -e uops_retired ./a.exe
性能计数器并不是在每个环境中都可以,因为访问PMC需要root权限,
5.3.3 事件多路复用和缩放
在某些情况下,我们想同事统计许多不同的事件,但是一个计数器一次只能统计一个事件。这就是为什么PMU中有多个计数器,即便如此,固定计数器和可编程技术起的数量也总是不够用的。显然,CPU没有那么多计数器这时多路复用技术可以发挥作用了。
如果事件多余计数器,则分析工具使用时间多路复用技术使每个事件都有机会访问监控硬件。
性能事件1 第一组 PMC1 PMC2 PMC3 PMC$
性能事件2
性能事件3
性能事件4 第二组
性能事件5
性能事件6
使用多路复用技术时,一个事件不会被一直测量,只有一部分能被测量,运行结束时,剖析工具需要根据运动时间和启动事件比来换算原始计数。
5.4 采样
采用时最常见的分析方法,a 在调试器下运行程序 b 每10s暂停一次程序 c 记录程序停止的位置。 每次捕获新样本时,所分析程序执行都会被中断,在中断时,剖析器收集程序状态的快照,并用快照构成一个样本。针对每个样本收集的信息可能包括在中断时执行的指令地址,寄存器状态,调用栈等,收集的样本数据存储在数据文件中,这些可以进一步用于显示调用图,程序中最耗时的部分和统计意义上重要的代码段控制流。
5.4.1 用户模式采样和基于硬件事件的采样。
即用户模式采样的基于硬件事件的采样EBS,用户模式采样是一种纯软件的方法,将代理库嵌入被分析的应用程序中。代理库为应用程序中的每个线程设置OS计时器,在计时器计时完成时,应用程序会接受到SIGPROF信号。用户模式下只能识别热点,二EBS可以用于涉及PMC的其他分析,例如对缓存未命中的采样,TMA等。
用户模式采样的EBS产生更多的运行时开销,当使用10ms 的默认采样间隔时,用户模式采样的平均开销约为5%,采样1ms的采样间隔时,EBS的平均开销约为2%. 因为可以以更高的频率收集样本,所以通常EBS更准确。
5.4.2 寻找热点
我们可以对任何想要查看性能事件进行采样,比如想知道程序哪里发生的L3缓存未命中最多。可以对应的事件(MEM_LOAD_RETIRED.L3_MISS)进行采样。
准备工作完成后,我们开始计数并运行基准测试。需要配置统计时钟周期的PMC,计数器每个时钟周期递增一次,最终会溢出。当计数器溢出时,硬件将发起PMI,剖析工具被配置成捕获PMI。 记录计数器溢出时CPU执行的指令,然后,将计数器重置为N并且恢复基准测试执行。现在,我们会到值N,使用该值可以控制获取新终端的频率。
多次重复古城,以获取足够的样本,接下来汇总这些样本可以构成程序中热点位置的直方图,就像下面的Linux Perf record 输出所显示的那样。
用linux perf工具收集调用栈有三种可能的方法。
1 帧指针 perf record--call-graph fp 需要二进制文件在编译构建时带上 --fnoomit-frame-pointer参数。因为帧指针RBP 无须从栈中弹出所有参数就能获取调用栈,所以以前常用于调试。