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

时间:2013-04-17 14:04:50

标签: linux profiling intel perf

我正在尝试使用多个(物理)处理器测量(Intel Xeon)计算机上的某些硬件事件。具体来说,我想知道有多少请求是为了阅读'offcore'数据而发出的。

我在Intels文档中找到了the OFFCORE_REQUESTS硬件事件,它给出了事件描述符0xB0,对于数据需求,还有额外的掩码0x01。

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

是否正确
perf record -e r0B1 ./mytestapp someargs

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

此区域的perf文档相当稀疏,除了tutorial entry之外没有说明它是哪个事件(虽然这个对我有用),或者它是如何编码的......

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:13)

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

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

因此,对于带有掩码0xB0的事件0x01,我可以致电:

perf record -e r1B0 ./mytestapp someargs

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

  • the c't magazine 13/03 (subscription required)中使用perf与原始事件的描述,其中描述了一些原始事件及其描述来自英特尔架构软件开发人员Manuel(第3b卷)
  • kernel mailing list上的补丁,讨论了记录它的正确方法。它指出上面的模式是“......特定于x86且不完整”
  • (已更新)较新版本的手册页显示了英特尔机器上的示例:man perf-list

<强>更新: 正如评论中指出的那样(谢谢!),libpfm转换器可用于获取正确的事件描述符。用户'osgx'发现的评论中链接的网站(Bojan Nikolic:如何监控所有CPU性能事件)更详细地解释了它。

答案 1 :(得分:3)

似乎你也可以使用:

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

我不知道这种语法的记录位置。

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

答案 2 :(得分:1)

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

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

Bojan Nikolic在"How to monitor the full range of CPU performance events"博客文章中提供了有关libpfm4 (perfmon2) lib使用情况的信息,以借助showevtinfocheck_events工具对性能进行原始编码。

还有一个perf python包装器ocperf,它接受​​intel的事件名称。它是由Andi Kleen(英特尔开源技术中心)撰写的,是pmu-tools set of utilitiesLWN post from 2013,intel在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 library还具有用于浏览带有某些描述的原始事件的工具-papi_native_avail