6

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

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

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

perf record -e r0B1 ./mytestapp someargs

或者这是不正确的?因为perf report这样输入的事件没有显示输出。

perf 文档在这方面相当稀疏,除了一个教程条目没有说明它是哪个事件(尽管这个对我有用),或者它是如何编码的......

任何帮助是极大的赞赏。

4

3 回答 3

15

好的,所以我想我想通了。

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

因此,对于0xB0带有面具的事件,0x01我可以调用:

perf record -e r1B0 ./mytestapp someargs

我无法在 perf 内核代码中找到它的确切解析(这里有任何内核黑客吗?),但我找到了以下来源:

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

更新:正如评论中指出的(谢谢!),libpfm 翻译器可用于获取正确的事件描述符。用户“osgx”发现的评论中链接的网站(Bojan Nikolic:如何监控所有 CPU 性能事件)对其进行了更详细的解释。

于 2013-04-18T08:53:53.590 回答
3

看来您也可以使用:

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

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

您也可以使用其他参数(edge、inv、cmask)。

于 2014-11-08T13:51:05.993 回答
2

有几个库可以帮助处理原始 PMU 事件。

perf 自己的 wiki https://perf.wiki.kernel.org/index.php/Tutorial#Events推荐perf list --help手册页以获取有关原始事件编码的信息。现代 perf 版本将列出原始事件作为perf list输出的一部分(“...如果链接到 libpfm4 库,则提供事件的一些简短描述。”)。perf list --details还将打印事件的原始 ID 和掩码。

Bojan Nikolic 有“如何监控所有 CPU 性能事件”博客文章,其中介绍了libpfm4 (perfmon2)库的使用,以便在同一库提供的工具showevtinfo和工具的帮助下为 perf 编码原始事件。check_events

还有一个 perf python 包装器ocperf,它接受英特尔的事件名称。它由 Andi Kleen(英特尔开源技术中心)编写,作为pmu-tools 实用程序集的一部分(2013 年的 LWN 帖子,英特尔在https://download.01.org/perfmon/上的事件列表)。有一个 ocperf (2011) http://halobates.de/modern-pmus-yokohama.pdf的演示:

ocperf
•Perf wrapper to support Intel specific events
•Allows symbolic events and some additional events

    ocperf record -a −e offcore_response.any_data.remote_dram_0 sleep 10

PAPI 库也有工具来探索带有一些描述的原始事件 - papi_native_avail.

于 2020-07-10T21:56:48.070 回答