使用perf了解记忆压力

时间:2014-10-31 19:58:43

标签: linux caching memory profiling perf

我正在尝试使用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

我的理解是缓存未命中是在整个缓存层次结构中遗漏的内存引用数。这与我得到的更多L1未命中而不是缓存未命中这一事实是一致的。

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

为什么缓存未命中数与LLC-missses值不同?如果整个缓存层次结构中出现错误,则必须在LLC中错过。

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

1 个答案:

答案 0 :(得分:1)

perf list列出的事件并非所有可以在系统中监视的事件。

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

  1. perf_events generic PMU :这些对应于perf list列出的事件。
  2. ix86arch(英特尔X86架构PMU):这些是所有英特尔x86架构中提供的性能计数器。
  3. snb(英特尔Sandy Bridge):哪些是特定于Sandy Bridge架构的计数器。
  4. 在确定了一个有趣的计数器之后,您可以将其作为选项传递给-e。 对于LLC未命中的具体情况,我发现三个计数器似乎与三个不同的集合相关:

    1. 缓存未命中,这是来自perf列表的标准列表。
    2. L3_LAT_CACHE:MISS
    3. LLC_MISSES
    4. 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% )
      

      这证实了所有这些计数器实际上是如何引用相同的东西。

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