为什么 perf 不适用于我的 Intel Skylake 服务器中的精确事件?

Why is perf not working for precise events in my Intel Skylake Server?

我想测量工作负载中远程和本地内存访问的百分比。我遇到了一些问题,因为我觉得我的 Skylake 服务器上的事件 mem_load_l3_miss_retired.remote_dram 和 mem_load_l3_miss_retired.local_dram 没有得到正确的数字。 所以我想利用 Precise 事件。但令我惊讶的是,我得到的是机器不支持的事件。尽管手册中将计数器称为 PEBS 计数器。

我的输出如下:

perf stat -e mem_load_l3_miss_retired.remote_dram:p sleep 2

Performance counter stats for 'sleep 2':

   <not supported>      mem_load_l3_miss_retired.remote_dram:p    

请帮助我找到解决方案。

您无法通过 perf stat 获得 Precise 事件编号。

perf stat 运行s 在非采样模式下,其中 perf 维护所有事件发生的 运行ning 计数。在计数模式下记录Precise events没有意义。 Precise events,正如Peter所提到的,帮助您正确缩小指令范围(实际上是+1指令,来自触发PEBS辅助的指令),样本中的记录归因于该指令。

此外,已知 PEBS 中断处理程序会导致与计数器溢出 NMI 发生冲突,当 perf stat 为 运行 时 运行s。为了更深入地理解,你应该看看 this 讨论。

由于以上原因,在非采样模式下记录precise事件已被禁用,可见here.

/* There's no sense in having PEBS for non sampling events: */
    if (!is_sampling_event(event))
            return -EINVAL;

您应该使用 perf record 来记录 precise 事件,因为事件 mem_load_l3_miss_retired.remote_dram 似乎支持 PEBS already.

perf record -e mem_load_l3_miss_retired.remote_dram:p sleep 2