【问题标题】:Using linux perf tool to measure the amount of times the CPU has to acccess the main memory使用 linux perf 工具测量 CPU 必须访问主存的次数
【发布时间】:2020-11-20 04:29:33
【问题描述】:

据我了解,perf 工具可以读取处理器上可用的硬件计数器以提供性能信息。比如我知道用L1-dcache-load-misses来衡量一级缓存没有请求数据的次数。

我想知道我的 CPU 在运行我的程序时必须访问 DRAM 多少次。使用perf list | grep dram 会抛出数百个我找不到任何信息的计数器。

那么,使用哪个事件来衡量 DRAM 被访问的次数?

【问题讨论】:

    标签: ram perf


    【解决方案1】:

    有很多事件都标有“dram”,但没有一个是你想要的...... :-(.

    对于 Intel 处理器,无法使用内核中的性能计数器计算所有 DRAM 流量。

    好消息是内存控制器中的性能计数器在我测试过的所有英特尔系统中都是准确的。坏消息是它们对具有“客户端”非核心的处理器和具有“服务器”非核心的处理器有不同的名称。

    在 Xeon Gold 或 Xeon Platinum 服务器系统上,可以使用以下方法找到事件:

    perf list | grep -i cas
    

    返回:

      uncore_imc_0/cas_count_read/                       [Kernel PMU event]
      uncore_imc_0/cas_count_write/                      [Kernel PMU event]
      uncore_imc_1/cas_count_read/                       [Kernel PMU event]
      uncore_imc_1/cas_count_write/                      [Kernel PMU event]
      uncore_imc_2/cas_count_read/                       [Kernel PMU event]
      uncore_imc_2/cas_count_write/                      [Kernel PMU event]
      uncore_imc_3/cas_count_read/                       [Kernel PMU event]
      uncore_imc_3/cas_count_write/                      [Kernel PMU event]
      uncore_imc_4/cas_count_read/                       [Kernel PMU event]
      uncore_imc_4/cas_count_write/                      [Kernel PMU event]
      uncore_imc_5/cas_count_read/                       [Kernel PMU event]
      uncore_imc_5/cas_count_write/                      [Kernel PMU event]
    

    相应的“perf stat”命令很长,但构造起来很简单。

    我无法使用任何带有“客户端”非核心的处理器进行测试,但像 https://www.intel.com/content/dam/www/public/us/en/documents/manuals/6th-gen-core-family-uncore-performance-monitoring-manual.pdf 这样的文档表明内存控制器性能计数器在这些产品中也可用。

    【讨论】:

    • 这将计算系统范围的内存访问,而不仅仅是一个进程的直接访问。因此,如果您想分析一个程序,则必须在其他空闲的系统上执行此操作。但是,是的,整洁。 Skylake-client 没有列出这些事件,它列出的 uncore_imc/data_reads/ 和 data_writes 最终“不支持”(Linux 5.9.8)
    • 啊,他们和unc_arb_trk_requests.all 之类的东西似乎与perf stat -a 一起工作,所以 perf 本身知道它们是系统范围的计数,并且只允许它们在系统范围模式下使用。
    【解决方案2】:

    (这并不能完全回答您的问题,希望有更多内存分析经验的其他人会回答。我提到的事件存在于 Skylake 客户端;IDK 关于其他 CPU。)

    在没有 L4 eDRAM 缓存的 CPU 上,您可以计算 L3 未命中数。例如mem_load_retired.l3_miss 用于负载。 (但这可能会将同一行的 2 次加载算作两次单独的未命中,即使它们都等待同一个 LFB 填充,所以实际上 DRAM 只看到一次访问。)

    并且它不会计算由硬件预取驱动的 DRAM 访问。另外,这只是计算负载,而不是存储后脏数据的回写。


    offcore_response 事件非常复杂,因为它们考虑了多套接字系统和窥探其他套接字、本地与远程 RAM 等的可能性。不确定是否有一个名称中带有 dram 的事件可以满足您的需求。此外,offcore_response 事件在demand_code_rddemand_data_rddemand_rfo(存储未命中)和other 之间划分。

    offcore_requests.l3_miss_demand_data_rd统计需求加载(非预取)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多