我正在尝试使用多个(物理)处理器测量(Intel Xeon)计算机上的某些硬件事件。具体来说,我想知道有多少请求是为了阅读'offcore'数据而发出的。
我在Intels文档中找到了the OFFCORE_REQUESTS硬件事件,它给出了事件描述符0xB0,对于数据需求,还有额外的掩码0x01。
告诉perf记录事件0xB1(即0xB0 | 0x01
)并将其称为:
perf record -e r0B1 ./mytestapp someargs
或者这是不正确的?
因为perf report
没有显示像这样输入的事件的输出。
此区域的perf文档相当稀疏,除了tutorial entry之外没有说明它是哪个事件(虽然这个对我有用),或者它是如何编码的......
非常感谢任何帮助。
答案 0 :(得分:13)
好的,所以我想我已经明白了。
对于我使用的Intel机器,格式如下:
<umask><eventselector>
其中两者都是十六进制值。可以删除umask的前导零,但不能删除事件选择器。
因此,对于带有掩码0xB0
的事件0x01
,我可以致电:
perf record -e r1B0 ./mytestapp someargs
我无法在perf内核代码中找到它的确切解析(这里有任何内核黑客?),但我找到了这些来源:
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使用情况的信息,以借助showevtinfo
和check_events
工具对性能进行原始编码。
还有一个perf python包装器ocperf
,它接受intel的事件名称。它是由Andi Kleen(英特尔开源技术中心)撰写的,是pmu-tools set of utilities(LWN 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
。