perf 功耗测量:它是如何工作的?

Posted

技术标签:

【中文标题】perf 功耗测量:它是如何工作的?【英文标题】:perf power consumption measure: How does it work? 【发布时间】:2019-05-02 16:03:30 【问题描述】:

我注意到perf list 现在可以选择测量功耗。您可以按如下方式使用它:

$ perf stat -e power/energy-cores/ ./a.out 
Performance counter stats for 'system wide':

              8.55 Joules power/energy-cores/

       0.949871058 seconds time elapsed

此测量的准确度如何,perf 如何估算功耗?

【问题讨论】:

【参考方案1】:

power/energy-cores/perf 计数器基于称为 MSR_PP0_ENERGY_STATUS 的 MSR 寄存器,它是英特尔 RAPL 接口的一部分(英特尔似乎将每个单独的 RAPL MSR 称为 RAPL 接口)。基于系统活动事件的复杂模型用于估计(静态和动态)能源消耗。 MSR 寄存器名称中包含 PP0,它指的是电源平面 0,它是 RAPL 域之一,包含套接字的所有内核,包括内核的私有缓存。然而,PP0 不包括最后一级缓存、互连、内存控制器、图形处理器以及非核心中的所有其他内容。无法测量MSR_PP0_ENERGY_STATUS 的准确度,因为没有其他方法可以仅估算电源平面 0 的能耗。

但可以测量其他 RAPL 域的准确性。其中包括 Package、DRAM 和 PSys 域。例如,封装域能量估计的准确性可以通过与整个系统的能耗(可以使用功率计测量)进行比较并运行一个工作负载来测量,该工作负载使封装外所有东西的能耗保持在已知范围内尽可能保持不变。 MSR_PKG_ENERGY_STATUSMSR_DRAM_ENERGY_STATUS 的准确性已由不同的人在许多不同的处理器上以不同的方式进行测量。更多信息可以参考最近的一篇题为RAPL in Action: Experiences in Using RAPL for Power Measurements的论文,其中还包括了之前工作的总结。这篇论文涵盖了桑迪桥、常春藤桥、哈斯韦尔和 Skylake。结论是 MSR_PKG_ENERGY_STATUSMSR_DRAM_ENERGY_STATUS 在 Haswell 和 Skylake 上似乎是准确的(Haswell 上的实现已更改,请参阅:An Energy Efficiency Feature Survey of the Intel Haswell Processor)。但这并不一定适用于所有类型的工作负载、P 状态和处理器。所以准确性不仅仅取决于微架构。

英特尔手册第 3 卷的第 14.9 节讨论了 RAPL 接口。我注意到该节中有错误。例如,它说客户端处理器不支持 DRAM 域,这是不正确的。我用来编写此答案的客户端 Haswell 处理器支持 DRAM 域。该部分可能已过时,仅适用于 Sandy Bridge 和 Ivy Bridge 处理器。我认为最好阅读要使用 RAPL 的处理器的数据表。

power/energy-pkg/perf 计数器可用于测量封装域的能耗。这是从 Sandy Bridge 开始的所有 Intel 处理器已知支持的唯一域。

【讨论】:

【参考方案2】:

在 x86 系统上,这些值基于 RAPL (Running Average Power Limit) - 一个提供内置 CPU 能量计数器的接口。虽然最初由 Intel 设计,但 AMD 还在 Zen 系统上提供了兼容的接口。

准确性取决于实际的微架构。最初,RAPL 是由具有某些偏见的模型支持的。在自 Haswell 架构以来的 Intel CPU 上,它基于非常准确的测量值。据我所知,对于 AMD 的 Zen RAPL 实现的准确性还没有很好的理解。

您必须考虑的一件重要事情是测量的范围。在大多数系统上,仅涵盖封装和 DRAM1。因此,如果您需要知道整个系统消耗了多少功率/能量 - 您通常无法用 RAPL 轻松回答。

另请注意,RAPL 每 1 毫秒更新一次,因此短工作负载会因更新速率而产生重大错误。

1 - Skylake 桌面系统可以实施全系统 RAPL。它的准确性取决于制造商。

【讨论】:

以上是关于perf 功耗测量:它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

读 perf 笔记 简写

如何测量云环境中虚拟机的功耗?

为啥用 perf 测量一个周期时,时间间隔比一个周期大?

如何“优雅”的测量系统性能

使用 linux perf 工具测量应用程序的 FLOP

如何测量 React 16 中浪费的渲染?