问题描述
我正在尝试使用 perf 来测量我机器上的某些事件,包括 L1-dcache-stores,与内核为 3.10.0-1127 的相对较旧的 CentOS 7 相比,我的机器具有相对较新的处理器 i9-10900K
问题在于,perf 报告 L1-dcache-stores 以及其他一些事件在我运行 perf stat -e L1-dcache-stores
时不受支持,因此我无法使用它,至少以一种直接的方式我无法使用它知道。但是,在内核为 4.18.0-193 的 CentOS 8 下,perf 在同一台机器上可以很好地处理此事件。所以,我怀疑这是因为旧内核不知道如何处理太新的处理器上的某些性能计数器,而 perf 本质上是内核的一部分。
我该怎么做才能在 CentOS 7 系统上使用 perf 并使 L1-dcache-stores 之类的东西在我的处理器上正常工作?我不能只是从 CentOS 8 中获取 perf 二进制文件并在 CentOS 7 上使用它,因为 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
解决方法
从 CentOS 内核软件包版本 4.18.0-151.el8
开始添加了对您的处理器 (Comet Lake) 的支持(请参阅 {{3} } 的内核)。因此,所有特定于模型的硬件事件,包括 L1-dcache-stores
,在 4.18.0-193 中的 perf 中都受名称支持,但在 3.10.0-1127 中不支持。这就是您得到 <not supported>
的原因。 perf stat
会告诉您所有归类为“硬件缓存事件”的事件在 3.10.0-1127 中均不受支持。英特尔架构硬件事件,例如 cycles
和 instructions
,在 perf_event 子系统的所有版本中均受名称支持。
在不支持运行它的处理器的内核上使用特定于模型的硬件事件的唯一方法是在 perf
命令中指定原始事件代码而不是事件名称。 changelog 手册的“任意 PMUS”部分描述了此方法。例如,性能事件 L1-dcache-stores
将映射到处理器上的本机事件 MEM_INST_RETIRED.ALL_STORES
。然后可以通过在英特尔手册中查找事件名称来确定事件代码。
perf stat -e cpu/event=0xd0,umask=0x82,name=MEM_INST_RETIRED.ALL_STORES/ ...