perf 缓存事件是啥意思?

Posted

技术标签:

【中文标题】perf 缓存事件是啥意思?【英文标题】:What are perf cache events meaning?perf 缓存事件是什么意思? 【发布时间】:2012-09-18 01:32:05 【问题描述】:

我试图弄清楚为什么修改后的 C 程序比未修改的计数器部分运行得更快(我添加了很少的代码行来执行一些额外的工作)。在这种情况下,我怀疑“缓存效果”是主要的解释(指令缓存)。因此,我使用了perf (https://perf.wiki.kernel.org/index.php/Main_Page) 分析工具,但不幸的是,我无法理解其关于缓存未命中的输出的含义。

提供了几个关于缓存的事件:

  cache-references                                   [Hardware event]
  cache-misses                                       [Hardware event]
  L1-dcache-loads                                    [Hardware cache event]
  L1-dcache-load-misses                              [Hardware cache event]
  L1-dcache-stores                                   [Hardware cache event]
  L1-dcache-store-misses                             [Hardware cache event]
  L1-dcache-prefetches                               [Hardware cache event]
  L1-dcache-prefetch-misses                          [Hardware cache event]
  L1-icache-loads                                    [Hardware cache event]
  L1-icache-load-misses                              [Hardware cache event]
  L1-icache-prefetches                               [Hardware cache event]
  L1-icache-prefetch-misses                          [Hardware cache event]
  LLC-loads                                          [Hardware cache event]
  LLC-load-misses                                    [Hardware cache event]
  LLC-stores                                         [Hardware cache event]
  LLC-store-misses                                   [Hardware cache event]
  LLC-prefetches                                     [Hardware cache event]
  LLC-prefetch-misses                                [Hardware cache event]
  dTLB-loads                                         [Hardware cache event]
  dTLB-load-misses                                   [Hardware cache event]
  dTLB-stores                                        [Hardware cache event]
  dTLB-store-misses                                  [Hardware cache event]
  dTLB-prefetches                                    [Hardware cache event]
  dTLB-prefetch-misses                               [Hardware cache event]
  iTLB-loads                                         [Hardware cache event]
  iTLB-load-misses                                   [Hardware cache event]
  branch-loads                                       [Hardware cache event]
  branch-load-misses                                 [Hardware cache event]
  node-loads                                         [Hardware cache event]
  node-load-misses                                   [Hardware cache event]
  node-stores                                        [Hardware cache event]
  node-store-misses                                  [Hardware cache event]
  node-prefetches                                    [Hardware cache event]
  node-prefetch-misses                               [Hardware cache event]

在哪里可以找到有关这些字段的说明? cache-misses 事件总是小于其他事件。本次活动衡量什么?

如何解释 ls 的 26,760 个 L1-icache-load-misses 与以下示例中的 5,708 个缓存未命中?

perf stat -e L1-icache-load-misses ls
caches  caches~  out

 Performance counter stats for 'ls':

            26,760 L1-icache-load-misses                                       

       0.002816690 seconds time elapsed



perf stat -e cache-misses ls
caches  caches~  out

 Performance counter stats for 'ls':

             5,708 cache-misses                                                

       0.002822122 seconds time elapsed

【问题讨论】:

我发现这很有用:Determining whether an application has poor cache performance \- Red Hat Developer 【参考方案1】:

一些答案​​:

L1 是一级缓存,最小也是最快的。另一方面,LLC 指的是cache hierarchy 的最后一级,因此表示最大但最慢的缓存。 id 区分指令缓存和数据缓存。这种方式只拆分了 L1,其他缓存在数据和指令之间共享。 TLB 指的是translation lookaside buffer,这是一种在将虚拟地址映射到物理地址时使用的缓存。 不同的 TLB 计数器取决于命名地址是指指令还是某些数据。 对于所有数据访问,根据给定内存位置是被读取、写入还是预取(即在稍后的某个时间检索以供读取),会保留不同的计数器。 未命中数表示访问给定数据项但出现在缓存中的频率。

【讨论】:

感谢您的回答。你在用这个工具吗?您如何解释称为硬件事件而不是硬件缓存事件的缓存未命中事件。我虽然是其他人的总和,但根本不是。 而且“加载”和“预取”有什么区别? @ManuelSelva:我自己没有使用perf,所以我没有多少实际经验。特别是,与所有硬件缓存事件相比,我不确定cache-misses 事件实际描述的是什么。我也不完全确定预取:有一种方法可以在应用程序级别触发预取以及硬件预测的数据访问的自动预取。这些中的一个或两个可能是预取计数器实际描述的内容。 perf 文档中提到了制造商规格以获取更多详细信息,但我还没有找到相关部分。 @ManuelSelva “加载”是指您的程序执行加载指令以检索内存。 “预取”是指处理器猜测您将在不久的将来加载内存,并提前获取它。这样,当您的程序确实使用内存时,它已经在缓存中了。【参考方案2】:

您似乎认为cache-misses 事件是所有其他类型的缓存未命中(L1-dcache-load-misses 等)的总和。事实并非如此。

cache-misses 事件表示任何缓存都无法提供的内存访问次数。

我承认 perf 的文档并不是最好的。

但是,通过阅读 perf_event_open( ) 功能:

http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html

例如,通过阅读可以看到perf list显示的cache-misses事件对应PERF_COUNT_HW_CACHE_MISSES

【讨论】:

另请参阅How does Linux perf calculate the cache-references and cache-misses events,了解有关映射到最新 Intel CPU 上的硬件事件的一些通用事件的一些基础知识。【参考方案3】:

根据perf tutorial,性能监控单元 (PMU) 事件硬件事件 指的是那些可以直接映射到 CPU 供应商的 CPU 特定事件的事件.但是硬件缓存事件是指perf提供的一些硬件事件名字对象,可能映射到CPU提供的实际事件。对于perf 的缓存事件列表,请在 Linux 终端中使用perf list cache

【讨论】:

以上是关于perf 缓存事件是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

用于缓存引用的 Linux perf 命令

电脑上SSL缓存是啥意思

SSL缓存是啥

一级缓存和二级缓存是啥意思??

为啥 perf 不报告缓存未命中?

ssl缓存是啥意思