【问题标题】:Understanding memory pressure using perf使用 perf 了解内存压力
【发布时间】:2014-12-28 05:40:29
【问题描述】:

我正在尝试使用 perf 分析应用程序,我现在只对进出 DRAM 的流量感兴趣。我无法从结果中了解此应用程序从 DRAM 获得的吞吐量是多少。

这就是我调用 perf 命令的方式:

perf stat -av -e LLC-misses,cache-misses,L1-dcache-load-misses <application>

我正在使用 -a,因为此应用程序确实与另一个正在运行的守护进程通信。

我得到的结果如下:

LLC-misses: 0 288628898 288606144
cache-misses: 373507 287154835 287143402
L1-dcache-load-misses: 3831372 286357135 286357135

 Performance counter stats for './mclient -d tpch-sf1 /home/lottarini/Desktop/DPU/queries/tpch-monetdb/02.sql':

                 0 LLC-misses                                                   [99.99%]
           373,507 cache-misses                                                 [100.00%]
         3,831,372 L1-dcache-load-misses                                       

       0.035855129 seconds time elapsed

我的理解是 cache-misses 是在整个缓存层次结构中丢失的内存引用的数量。这与我得到的 L1 未命中数比缓存未命中数多的事实是一致的。

首先,为什么该工具不输出 L1 未命中的置信度值?

为什么缓存未命中数与 LLC-misses 值不同?如果在整个缓存层次结构中遗漏了某些内容,则它必须在 LLC 中遗漏。

此外,如果我想提取由于这些未命中而传输的数量数据,我该如何计算呢?是否有我可以指定的 perf 事件选项,或者我是否需要将这些数字乘以内存块的大小 [谁知道] 以防丢失?

【问题讨论】:

  • 你能说出你在哪个 CPU 架构上运行它吗? perf 输出完全取决于 Linux 内核是如何为该架构配置的。
  • Proc: ark.intel.com/products/52213/… uname -a: Linux c1 3.2.0-70-generic #105-Ubuntu SMP Wed Sep 24 19:49:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

标签: linux caching memory profiling perf


【解决方案1】:

perf list 列出的事件并不是系统中可以监控的所有事件。

您可以使用命令showevtinfo 安装 libpfm 以获取系统中所有可用事件计数器的列表。在沙桥机器的情况下,会有三组显示evtinfo的计数器:

  1. perf_events generic PMU:这些对应于 perf list 列出的事件。
  2. ix86arch(英特尔 X86 架构 PMU):这些是所有英特尔 x86 架构中可用的性能计数器。
  3. snb(Intel Sandy Bridge):这是 Sandy Bridge 架构特有的计数器。

确定一个有趣的计数器后,您可以使用 -e 将其作为 perf stat 的选项传递。 对于 LLC-misses 的具体情况,我发现三个计数器似乎与三个不同的集合相关:

  1. 缓存未命中,位于 perf 列表的标准列表中。
  2. L3_LAT_CACHE:MISS
  3. LLC_MISSES

showevtinfo 的好处在于,它为每个特定于机器的计数器添加了描述。此外,如果您尝试在 Intel 机器上进行分析,您可以在 Intel Developer Manual 中找到可用计数器的完整列表 您可以使用 libpfm 附带的 check_events 程序将计数器的名称转换为可以传递给 perf 的代码,例如:

Requested Event: LAST_LEVEL_CACHE_MISSES
Actual    Event: snb::L3_LAT_CACHE:MISS:k=1:u=1:e=0:i=0:c=0:t=0
PMU            : Intel Sandy Bridge
IDX            : 142606383
Codes          : 0x53012e

然后再使用最后的代码:

sudo perf stat -r 10 -a -e cache-misses,r53012e,r53412e <command>

10,553,469 cache-misses                                                  ( +-  1.60% ) [100.00%]
10,556,094 r53012e                                                       ( +-  1.60% ) [100.00%]
10,557,004 r53412e                                                       ( +-  1.60% )

这证实了所有这些计数器实际上是如何指代同一事物的。

最后,您可以将这些值乘以缓存块的大小,以获得实际传输的数据量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2013-12-08
    • 2014-09-01
    • 2011-12-08
    相关资源
    最近更新 更多