2014-10-31 455 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%) 

這證實了所有這些計數器實際上如何引用同樣的事情。

最後,您可以將這些值與緩存塊的大小相乘,以獲得實際傳輸的數據量。