让perf在较新的处理器上正确使用某些性能计数器



我正在尝试使用perf来测量我的机器上的某些事件,包括L1 dcache存储,与内核为3.10.0-1127 的相对旧的CentOS 7相比,我的机器有一个相对新的处理器i9-10900K

问题是,perf报告说,当我运行perf stat -e L1-dcache-stores时,不支持L1dcache存储以及其他一些事件,所以我不能使用它,至少在我知道的直接方式中是这样。然而,在带有内核4.18.0-193的CentOS8下,perf在同一台机器上可以很好地处理此事件。所以,我怀疑这是因为旧的内核不知道如何处理太新的处理器上的某些性能计数器,而perf本质上是内核的一部分。

我该怎么做才能在Centos7系统上使用perf,并使L1 dcache存储之类的东西在我的处理器上正常工作?我不能只从CentOS8获取perf二进制文件并在CentOS7上使用,因为glibc版本不同。

$ sudo perf stat -e L1-dcache-stores echo

Performance counter stats for 'echo':
<not supported>      L1-dcache-stores                                            
0.000486304 seconds time elapsed
0.000389000 seconds user
0.000000000 seconds sys

对您的处理器(Comet Lake(的支持是从CentOS内核包版本4.18.0-151.el8开始添加的(请参阅内核更改日志中列出的标题为"perf/x86/intel:Add-Commet Lake CPU支持"的提交(。因此,所有型号特定的硬件事件,包括L1-dcache-stores,在4.18.0-193的perf中都有名称支持,但在3.10.0-1127中没有。这就是你得到<not supported>的原因。CCD_ 5将告诉你;硬件高速缓存事件";在3.10.0-1127中不支持。英特尔体系结构硬件事件,如cyclesinstructions,在所有版本的perf_event子系统中都按名称支持。

在不支持其运行处理器的内核上使用特定于型号的硬件事件的唯一方法是在perf命令中指定原始事件代码而不是事件名称。这种方法在";ARBITARY PMUS";部分。例如,perf事件L1-dcache-stores将映射到处理器上的本机事件MEM_INST_RETIRED.ALL_STORES。然后,可以通过在英特尔手册中查找事件名称来确定事件代码。

perf stat -e cpu/event=0xd0,umask=0x82,name=MEM_INST_RETIRED.ALL_STORES/ ...

最新更新