如何使用Linux的perf工具捕获L3缓存的命中和未命中

3
有没有办法在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缓存的别名。我的问题是如何使用perf工具在Linux中捕获L3缓存的命中和失效情况。提前感谢!


你的CPU是什么?较新版本的perf和Linux内核可能支持某些CPU上的L3缓存事件。你确定“LLC”是L2的别名而不是L3吗(真正的含义可能在perf代码的内核部分中定义)? - osgx
3个回答

6
我更喜欢使用原始事件计数器,并直接查看英特尔软件开发手册以获取详细定义,我已获得更多成功。您可能需要查看第18.2.1.2节“预定义的体系结构性能事件”,其中r412e “LLC Misses”可能是您想要的一个。请参考:http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.html
perf stat -e r412e <command>

(请注意,对于我来说,这会给出与使用-e cache-misses相同的数字。)

1
要获取系统范围内的 L3 缓存缺失率,只需执行以下命令:sudo perf stat -a -e LLC-loads -e LLC-load-misses -e LLC-stores -e LLC-store-misses -e LLC-prefetch-misses,该命令将打印出缺失和总引用。这个比率就是 L3 缓存缺失率。 - Zheng Shao

5
LLC(最后一级缓存)如果硬件有L3缓存,则配置为“L2”是奇怪的。但我还不了解perf的内部情况,也许这些设置是通用的。我认为你唯一的解决方案是使用“原始硬件事件”(参见“perf list”末尾,以“rNNN”开头的行)。这为编码硬件寄存器的描述提供了机会。perf用户指南和教程只提到“要测量由HW供应商文档提供的实际PMU,请传递十六进制参数代码”。我不知道在英特尔上的语法是什么,以及是否存在该体系结构上性能监视器的不同实现。你可以从这里开始:

http://code.google.com/p/kernel/wiki/PerfUserGuide#Hardware_events


网页http://www.bnikolic.co.uk/blog/hpc-prof-events.html提供了使用libpfm4(perfmon2)工具的“showevtinfo”和“check_events”来搜索和使用原始性能事件的建议。 - osgx

2
要获取系统范围内的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缓存未命中率。

在维基上查看完整的事件列表:https://perf.wiki.kernel.org/index.php/Tutorial#Events


请问LLC预取丢失是什么,以及它们应该如何用于计算L3缓存失效率?到目前为止,我的计算方法只是(LLC加载丢失+LLC存储丢失) / (LLC加载+LLC存储)。 - blaze9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接