使用perf来监视原始事件计数器

我正在尝试使用多个(物理)处理器来测量(Intel Xeon)机器上的某些硬件事件。 具体来说,我想知道为了读取“offcore”数据发出了多less请求。

我在英特尔文档中find了OFFCORE_REQUESTS硬件事件,它给出事件描述符0xB0和数据需求,附加掩码0x01。

那么告诉perflogging事件0xB1(即0xB0 | 0x01 )并将其称为:

 perf record -e r0B1 ./mytestapp someargs 

或者这是不正确的? 由于perf report没有显示像这样input事件的输出。

在这个领域中,perf文件相当稀less,除了一个教程条目 ,它没有说出它是哪个事件(虽然这个是适合我的),或者它是如何编码的…

任何帮助是极大的赞赏。

好的,所以我想我明白了。

对于我使用的Intel机器,格式如下: <umask><eventselector>其中两个都是十六进制值。 umask的前导零可以被删除,但不能用于事件选择器。

所以对于带掩码0x01的事件0xB0 ,我可以调用:

 perf record -e r1B0 ./mytestapp someargs 

我无法在perf内核代码(这里的任何内核黑客?)找到它的确切解析,但我发现这些来源:

  • 在13/03杂志(需要订阅)中描述了使用原始事件的情况,其中描述了一些原始事件以及来自英特尔架构软件开发人员手册(第3b卷)的描述,
  • 内核邮件列表上的补丁,讨论正确的方式来记录它。 它指出,上面的模式是“…是x86特定的,不完整的”
  • (已更新)新版本的手册页显示了英特尔机器上的一个示例: man perf-list

更新 :正如在注释中指出的那样(谢谢!),libpfm转换器可以用来获取适当的事件描述符。 用户'osgx'发现的评论(Bojan Nikolic:如何监控CPU性能事件的全部范围)中链接的网站对此进行了更详细的解释。

看来你也可以使用:

 perf record -e cpu/event=0xB1,umask=0x1/u ./mytestapp someargs 

我不知道这个语法在哪里被记录。

你也可以使用其他的参数(edge,inv,cmask)。