我正在尝试使用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事件选项,或者我需要将这些数字乘以内存块的大小[谁知道]在未命中的情况下传输?
答案 0 :(得分:1)
perf list列出的事件并非所有可以在系统中监视的事件。
您可以使用命令showevtinfo
安装libpfm以获取系统中所有可用事件计数器的列表。在沙桥机器的情况下,将有三组显示器显示文件:
在确定了一个有趣的计数器之后,您可以将其作为选项传递给-e。 对于LLC未命中的具体情况,我发现三个计数器似乎与三个不同的集合相关:
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% )
这证实了所有这些计数器实际上是如何引用相同的东西。
最后,您可以将这些值乘以缓存块的大小,以获得实际传输的数据量。