2014-10-31 449 views
0

我正在尝试使用perf来分析应用程序,而现在我只对流入/流出DRAM的流量感兴趣。我无法从结果中理解这个应用程序从DRAM获得的吞吐量。使用perf了解内存压力

这是我如何调用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未命中值不同?如果在整个高速缓存层次结构中发生错误,它必须在LLC中错过。

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

+0

你能告诉你正在运行这个CPU架构吗? perf的输出完全取决于如何为该体系结构配置Linux内核。 – 2014-11-03 08:52:37

+0

Proc:http://ark.intel.com/products/52213/Intel-Core-i7-2600-Processor-8M-Cache-up-to-3_80-GHz 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 – igon 2014-11-03 15:44:50

回答

1

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

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

  1. perf_events通用PMU:这相当于由PERF列表中列出的事件。
  2. ix86arch(Intel X86体系结构PMU):这些是所有Intel x86体系结构中都有的性能计数器。
  3. snb(Intel Sandy Bridge):哪些是Sandy Bridge架构特有的计数器。

确定了一个很有意思的计数器之后,您可以将它作为选项传递给perf,并将其与-e关联。 对于LLC门柱的特定情况下,我发现三个计数器,似乎从三个differet组相关:

  1. 缓存缺失是从PERF列表中的标准列表。
  2. L3_LAT_CACHE:MISS
  3. LLC_MISSES

什么是好的showevtinfo的是,需要说明的是增加了对每一个计数器,机器具体。此外,如果您尝试在英特尔机器上进行配置文件分析,可以在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%) 

这证实了所有这些计数器实际上如何引用同样的事情。

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