【问题标题】:Using perf to monitor raw event counters使用 perf 监控原始事件计数器
【发布时间】:2013-04-10 08:17:32
【问题描述】:

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

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

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

perf record -e r0B1 ./mytestapp someargs

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

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

非常感谢任何帮助。

【问题讨论】:

    标签: linux profiling intel perf


    【解决方案1】:

    好吧,我想我想通了。

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

    所以对于带有面具0x01 的事件0xB0,我可以致电:

    perf record -e r1B0 ./mytestapp someargs
    

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

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

    更新: 正如 cmets 中所指出的(谢谢!),libpfm 转换器可用于获取正确的事件描述符。用户 'osgx' 发现的 cmets 中链接的网站(Bojan Nikolic: How to monitor the full range of CPU performance events)对其进行了更详细的解释。

    【讨论】:

    • 查看 libpfm,它有助于将事件名称(表示为字符串)转换为事件编码,即硬件供应商记录的原始事件或特定于操作系统的编码。在后一种情况下,库能够准备内核设置事件所需的特定于操作系统的数据结构。
    • @redblackbit 很棒的发现!谢谢
    • showevtinfocheck_events 的帮助下,有一个页面bnikolic.co.uk/blog/hpc-prof-events.html 是关于libpfm4 使用来编码性能的原始事件。帕特里克,谢谢你的提问和回答。
    • 谢谢@osgx!我已经更新了答案以反映这一点。
    • 帕特里克,你不会相信的。我刚刚为 Andi Kleen(英特尔开源技术中心)as part of pmu-tools set of utilities (ML announce 制造的英特尔 CPU 找到了名为 ocperf 的出色 python 性能包装器。项目主页是github.com/andikleen/pmu-tools,cpu 事件列表由 Intel 在其 01.org 网站上维护和更新:download.01.org/perfmon(自动下载器包含在 pmu-tools 中),演示在 halobates.de/modern-pmus-yokohama.pdf
    【解决方案2】:

    看来你也可以用:

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

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

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

    【讨论】:

      【解决方案3】:

      有几个库可以帮助处理原始 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 有一篇关于 libpfm4 (perfmon2) 库使用 showevtinfocheck_events 工具为 perf 编码原始事件的 "How to monitor the full range of CPU performance events" 博客文章,这两个工具随同一个库一起提供。

      还有 perf python 包装器ocperf,它接受英特尔的事件名称。它由 Andi Kleen(英特尔开源技术中心)作为pmu-tools set of utilitiesLWN post from 2013,intel 的事件列表https://download.01.org/perfmon/)的一部分编写。有一个ocperf的demo(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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        • 2020-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多