我看不到 perf 的功率/能量核心选项来测量功耗

Posted

技术标签:

【中文标题】我看不到 perf 的功率/能量核心选项来测量功耗【英文标题】:I can't see perf's power/energy-cores option for measure power consumption 【发布时间】:2020-03-20 08:56:27 【问题描述】:

我的系统使用 Intel(R) Xeon(R) Gold 处理器和 Centos,Linux 内核 5.5.2 版本

perf 版本输出为5.5.2-1.el7.elrepo.x86_64

我不会得到每个核心的功耗。 所以我尝试了这个。

>>>  sudo perf stat -a -r 1 -e "power/energy-cores/" ./run
event syntax error: 'power/energy-cores/'
                           \___ unknown term

valid terms: event,config,config1,config2,name,period,percore

Initial error:
event syntax error: 'power/energy-cores/'
                           \___ unknown term

valid terms: event,config,config1,config2,name,period,percore
Run 'perf list' for a list of valid events

 Usage: perf stat [<options>] [<command>]

    -e, --event <event>   event selector. use 'perf list' to list available event

如您所见,发生了错误。

所以我查看了/sys/bus/event_source/devices/power/events 目录,看看这里有什么事件。

在结果下。

>>> ls /sys/bus/event_source/devices/power/events

energy-pkg  energy-pkg.scale  energy-pkg.unit  energy-ram  energy-ram.scale  energy-ram.unit

我看不到power/energy-cores 选项。 我只有power/energy-pkgpower/energy-ram 选项。

有些人有power/energy-gpu

如何获得energy-coresenergy-gpu

>>> perf list | grep energy
  power/energy-pkg/                                  [Kernel PMU event]
  power/energy-ram/                                  [Kernel PMU event]


>>> sudo perf stat -a -r 1 -e "power/energy-pkg/" -e "power/energy-ram/" ./run
6765
 Performance counter stats for 'system wide':

              0.06 Joules power/energy-pkg/
              0.01 Joules power/energy-ram/

       0.001452589 seconds time elapsed

【问题讨论】:

【参考方案1】:

perf 添加了一个非核心 PMU 以公开英特尔 RAPL 能耗计数器。 perf 中的事件power/energy-corespower/gpu 分别映射到RAPL 域PP0PP1。你可以看到这个here。

static struct perf_msr rapl_msrs[] = 
    [PERF_RAPL_PP0]  =  MSR_PP0_ENERGY_STATUS,      &rapl_events_cores_group, test_msr ,
    [PERF_RAPL_PKG]  =  MSR_PKG_ENERGY_STATUS,      &rapl_events_pkg_group,   test_msr ,
    [PERF_RAPL_RAM]  =  MSR_DRAM_ENERGY_STATUS,     &rapl_events_ram_group,   test_msr ,
    [PERF_RAPL_PP1]  =  MSR_PP1_ENERGY_STATUS,      &rapl_events_gpu_group,   test_msr ,
    [PERF_RAPL_PSYS] =  MSR_PLATFORM_ENERGY_STATUS, &rapl_events_psys_group,  test_msr ,
;

要了解 RAPL 域,请访问英特尔软件开发人员手册第 3b 卷(电源和热管理章节)。

每个领域都有自己的架构能力。这些功能将通过处理器中某些非架构 MSR 的存在来指示。但这些域的存在因不同的英特尔处理器型号类型而异。有些处理器型号将支持所有这些域,有些则只支持少数几个。

perf 尝试探查这些 RAPL MSR,并根据处理器型号创建rapl_model_match 设备表,遵循 msr 和 cstate 模块设计。

快照是here。

例如,您可以看到 here 仅支持域 PackageDRAM

static struct rapl_model model_knl = 
    .events     = BIT(PERF_RAPL_PKG) |
                  BIT(PERF_RAPL_RAM),
    .apply_quirk    = true,
;

因此,为了获取其他事件,您必须使用具有不同处理器型号的系统,从而确保所有相关 RAPL MSR 的存在。您不能只在现有系统中构建支持来神奇地使用 energy-coresgpu 事件。

【讨论】:

感谢您的回答。我可以获得许多 perf 的细节和原理,并且知道我在我的 perf 域的 linux 内核代码中找到的位置。感谢变化很大。 :) 我还有一个问题。如何更改 MSR 寄存器内容?我找到了一个使用“MSR-Tool”的解决方案,除了使用 MSR-Tool 之外,还有另一种更改 MSR 寄存器的方法吗? 除了MSR-Tool,您还可以使用wrmsr。

以上是关于我看不到 perf 的功率/能量核心选项来测量功耗的主要内容,如果未能解决你的问题,请参考以下文章

开源功率计,带电源功能,专用于物联网功耗测量

iOS 应用程序的能量仪表中的能量级别都有哪些功率/能耗单位?

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

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

如何实时测量 PC 组件(cpu、内存、磁盘等)的功率(瓦​​特)?

频谱能量信号功率信号能量谱功率谱及一些定理