如何在 Linux 中通过 perf 工具捕获 L3 缓存命中和未命中
Posted
技术标签:
【中文标题】如何在 Linux 中通过 perf 工具捕获 L3 缓存命中和未命中【英文标题】:How to catch the L3-cache hits and misses by perf tool in Linux 【发布时间】:2013-08-11 13:20:58 【问题描述】:有什么方法可以通过 Linux 中的 perf 工具捕获 L3 缓存命中和未命中。根据perf list cache
的输出,支持L1和LLC缓存。根据perf源码中perf_evsel__hw_cache数组的定义:
const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX]
[PERF_EVSEL__MAX_ALIASES] =
"L1-dcache", "l1-d", "l1d", "L1-data", ,
"L1-icache", "l1-i", "l1i", "L1-instruction", ,
"LLC", "L2", ,
"dTLB", "d-tlb", "Data-TLB", ,
"iTLB", "i-tlb", "Instruction-TLB", ,
"branch", "branches", "bpu", "btb", "bpc", ,
"node", ,
;
LLC 是 L2-cache 的别名。我的问题是如何通过 Linux 中的 perf 工具捕获 L3 缓存命中和未命中。提前致谢!
【问题讨论】:
你的 CPU 是多少?较新版本的 perf 和 linux 内核可能支持某些 CPU 上的 L3 缓存事件。您确定“LLC”是 L2 的别名而不是 L3 的别名(真正的含义可能在 perf 代码的内核部分中定义)? 【参考方案1】:如果硬件有 L3 缓存,那就奇怪 LLC(Last Level Cache)配置为“L2”。但我还不知道 perf 的内部结构,也许这些设置是通用的。
我认为您唯一的解决方案是使用“原始硬件事件”(参见“性能列表”末尾,以“rNNN”开头的行)。这提供了对硬件寄存器的描述进行编码的机会。
perf 用户指南和教程仅提及“要测量硬件供应商文档提供的实际 PMU,请传递十六进制参数代码”。我不知道 Intel 的语法是什么,以及此架构上是否有不同的性能监视器实现。你可以从这里开始:
http://code.google.com/p/kernel/wiki/PerfUserGuide#Hardware_events
【讨论】:
页面 bnikolic.co.uk/blog/hpc-prof-events.html 建议在 libpfm4 (perfmon2) 实用程序showevtinfo
和 check_events
的帮助下搜索和使用原始性能事件【参考方案2】:
我在使用原始事件计数器方面取得了更大的成功,直接查看英特尔软件开发人员手册了解详细定义。
http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.html
来自部分: 18.2.1.2 预定义的架构性能事件
r412e "LLC Misses" 可能是您想要的
perf stat -e r412e <command>
(请注意,对我来说,这给出的数字与使用 -e cache-misses 的数字相同。)
【讨论】:
要获得系统范围的 L3 缓存未命中率,只需执行以下操作:sudo perf stat -a -e LLC-loads -e LLC-load-misses -e LLC-stores -e LLC-store-misses -e LLC-prefetch-misses
,它会打印出未命中和总引用。该比率是 L3 缓存未命中率。【参考方案3】:
要获得系统范围的 L3 缓存未命中率,只需执行以下操作:
$ sudo perf stat -a -e LLC-loads,LLC-load-misses,LLC-stores,LLC-store-misses,LLC-prefetch-misses sleep 5
Performance counter stats for 'system wide':
24,477,266,369 LLC-loads (22.65%)
1,409,470,007 LLC-load-misses # 5.76% of all LL-cache hits (29.79%)
88,584,705 LLC-stores (30.32%)
10,545,277 LLC-store-misses (30.03%)
150,785,745 LLC-prefetch-misses (34.71%)
13.773144159 seconds time elapsed
这会打印出未命中数和总引用数。该比率是 L3 缓存未命中率。
在 wiki 上查看完整的事件列表:https://perf.wiki.kernel.org/index.php/Tutorial#Events
【讨论】:
请问什么是 LLC-prefetch-misses 以及如何使用它们来计算 L3 缓存未命中率?到目前为止,我的计算很简单(LLC-load-misses+LLC-store-misses)/(LLC-loads+LLC-stores)以上是关于如何在 Linux 中通过 perf 工具捕获 L3 缓存命中和未命中的主要内容,如果未能解决你的问题,请参考以下文章