硬件缓存事件和性能分析工具

10

当我运行perf list命令时,我看到了一堆硬件缓存事件,如下所示:


Translated:

当我运行perf list命令时,我看到了一堆硬件缓存事件,如下所示:

$ perf list | grep 'cache event'
  L1-dcache-load-misses                              [Hardware cache event]
  L1-dcache-loads                                    [Hardware cache event]
  L1-dcache-stores                                   [Hardware cache event]
  L1-icache-load-misses                              [Hardware cache event]
  LLC-load-misses                                    [Hardware cache event]
  LLC-loads                                          [Hardware cache event]
  LLC-store-misses                                   [Hardware cache event]
  LLC-stores                                         [Hardware cache event]
  branch-load-misses                                 [Hardware cache event]
  branch-loads                                       [Hardware cache event]
  dTLB-load-misses                                   [Hardware cache event]
  dTLB-loads                                         [Hardware cache event]
  dTLB-store-misses                                  [Hardware cache event]
  dTLB-stores                                        [Hardware cache event]
  iTLB-load-misses                                   [Hardware cache event]
  iTLB-loads                                         [Hardware cache event]
  node-load-misses                                   [Hardware cache event]
  node-loads                                         [Hardware cache event]
  node-store-misses                                  [Hardware cache event]
  node-stores                                        [Hardware cache event]

这些事件根据测试似乎大多返回合理的值,但我想知道如何确定将这些事件映射到我的系统上的硬件性能计数器事件?

也就是说,这些事件肯定是使用Skylake CPU上一个或多个底层x86 PMU计数器实现的 - 但我怎么知道是哪些计数器?

您可以查看/sys/devices/cpu/events以获取其他硬件事件,但无法查看“硬件缓存事件”。


4
这个链接对你有帮助吗? - Margaret Bloom
@MargaretBloom,对于那些有足够动力阅读源代码的人来说是可以的: )。我试图不让它变成“回答自己的问题”类型的问题,但我想这可能是... - BeeOnRope
如果您能耐心等待,我会尽快在有空的时间里给您回答 :) - Margaret Bloom
@MargaretBloom 今天我猜我不需要,似乎指向正确文件的指针足以让我开始,因为在你提供帮助之前我已经写了一个答案!当然,可能有更好的答案。我想你可能对这个相关问题有一些见解:https://stackoverflow.com/q/52173478/149138。 - BeeOnRope
1个回答

8

用户@Margaret在评论中提出了一个合理的答案- 阅读内核源代码以查看 PMU 事件的映射。

我们可以检查arch/x86/events/intel/core.c 的事件定义。我不确定这里的“core”是否指 Core 架构,还是说这只是大多数定义都良好的核心 - 但无论如何,这就是您要查看的文件。

关键部分是此部分,它定义了skl_hw_cache_event_ids

static __initconst const u64 skl_hw_cache_event_ids
                [PERF_COUNT_HW_CACHE_MAX]
                [PERF_COUNT_HW_CACHE_OP_MAX]
                [PERF_COUNT_HW_CACHE_RESULT_MAX] =
{
 [ C(L1D ) ] = {
    [ C(OP_READ) ] = {
        [ C(RESULT_ACCESS) ] = 0x81d0,  /* MEM_INST_RETIRED.ALL_LOADS */
        [ C(RESULT_MISS)   ] = 0x151,   /* L1D.REPLACEMENT */
    },
    [ C(OP_WRITE) ] = {
        [ C(RESULT_ACCESS) ] = 0x82d0,  /* MEM_INST_RETIRED.ALL_STORES */
        [ C(RESULT_MISS)   ] = 0x0,
    },
    [ C(OP_PREFETCH) ] = {
        [ C(RESULT_ACCESS) ] = 0x0,
        [ C(RESULT_MISS)   ] = 0x0,
    },
},
...

解读嵌套初始化器后,您会发现L1D-dcahe-load对应于MEM_INST_RETIRED.ALL_LOAD,而L1-dcache-load-misses对应于L1D.REPLACEMENT

我们可以使用perf进行双重检查:

$ ocperf stat -e mem_inst_retired.all_loads,L1-dcache-loads,l1d.replacement,L1-dcache-load-misses,L1-dcache-loads,mem_load_retired.l1_hit head -c100M /dev/zero > /dev/null

 Performance counter stats for 'head -c100M /dev/zero':

        11,587,793      mem_inst_retired_all_loads                                   
        11,587,793      L1-dcache-loads                                             
            20,233      l1d_replacement                                             
            20,233      L1-dcache-load-misses     #    0.17% of all L1-dcache hits  
        11,587,793      L1-dcache-loads                                             
        11,495,053      mem_load_retired_l1_hit                                     

       0.024322360 seconds time elapsed

“硬件缓存”事件显示的值与我们通过检查源代码猜测的底层PMU事件完全相同。”

非常好的答案,谢谢!但是像 L1-dcache-write-misses 这样具有 0x0 值的事件是怎么回事?还有 node-read-missesnode-read-accessesnode-write-missesnode-write-accesses 都具有相同的值,这又是怎么回事呢? - Orion Papadakis
1
@OrionPapadakis - 很好的问题,我不确定。也许值得再次提问。自从发布这个问题以来,性能显示某些事件的方式已经得到了改进。查找信息的另一种方式是使用pmu-tools中的event-rmap - BeeOnRope

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