微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决让 perf 在较新的处理器中正确使用某些性能计数器

我正在尝试使用 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 中均不受支持。英特尔架构硬件事件,例如 cyclesinstructions,在 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/ ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。