如何获取CPU内核在Linux内核中的能耗?
How to get CPU cores' energy consumption in Linux kernel?
我正在做动态电压和频率缩放 (DVFS) 算法的实验,需要在 Linux 内核中获取 CPU 内核的能耗。
我正在考虑使用 powercap Power Capping Framework.
这里是powercap_zone_ops结构powercap.h:
struct powercap_zone_ops {
int (*get_max_energy_range_uj) (struct powercap_zone *, u64 *);
int (*get_energy_uj) (struct powercap_zone *, u64 *);
int (*reset_energy_uj) (struct powercap_zone *);
int (*get_max_power_range_uw) (struct powercap_zone *, u64 *);
int (*get_power_uw) (struct powercap_zone *, u64 *);
int (*set_enable) (struct powercap_zone *, bool mode);
int (*get_enable) (struct powercap_zone *, bool *mode);
int (*release) (struct powercap_zone *);};
看起来get_energy_uj非常符合我的需求。要注册一个power zone,我需要使用struct device来描述我的CPU,但我不知道如何去做
如果有人能给我一些例子,这对我来说将是一个非常有价值的帮助。
谢谢!
有两种情况——较长时间的平均功耗(不能用于高频测量)和瞬时功耗(可以用于高频测量)。
对于第一种情况(较长时间段内的平均功耗),CPU 本身直到最近(也许是最近 5 年?)和大多数其他部分都没有任何支持电脑还是不支持。解决这些问题需要大量的工作来构建“每个硬件的最大功耗”(在驱动程序等中)的数据库,并编写代码以尝试根据负载估计硬件与最大值的接近程度给予;但没有 OS 支持这一点。此外(或作为替代);您可能能够从电源链 - 从外部 UPS 或笔记本电脑电池管理中获得“总体总功耗”(但如果您只关心 CPUs 的功耗,那是没用的) .
针对第二种情况;几乎没有硬件(几乎没有 CPUs)支持它。你必须估计它。对于 CPUs,估计瞬时功耗将涉及拦截所有功耗变化,这意味着拦截 software/voluntary 电源管理变化(通常是 CPUs 空闲的结果)和 hardware/involuntary 电源管理变化(通常是 CPUs 达到“最高温度”限制的结果)加上任何影响调度的东西(在任何时刻有多少内核在使用)加上像 AVX use/disuse (因为 CPU 在使用 AVX 时会消耗更多功率并降低其时钟频率)。当然也不OS支持这个。
但是;比那更糟。对于瞬时值,存在 latency/sampling 问题。如果您的软件每隔一段时间检查一次瞬时值,它将获得可能具有误导性的陈旧信息(例如,如果功耗在某些时刻 100W 和其他时刻 5W 之间波动,那么您可能只会看到“100W 样本”并且可能只会看到“5W样本”,无论哪种情况,您都无法判断样本是否具有误导性)。要解决该问题,您必须将数据存储为“持续时间”(许多“从开始时间到结束时间的功耗为..”条目的列表)并为“持续时间”设计interfaces/APIs;因此“持续时间”条目可用于在过去的任何时刻找到正确的值,准确估计未来时刻的值(不要忘记“现在(考虑到 123 纳秒的延迟)”相当于估计一个值即未来的 123 纳秒)并计算任何时间段内的平均值。再次;不 OS 也支持(甚至不支持其他更容易的事情)。
It looks like get_energy_uj perfectly meets my needs.
Powercap 是一种基于硬件 (Intel) 提供的便利(更便携、更易于访问)的抽象。
如果你深入研究 Intel 的手册,你会发现“每 CPU”或“每核”功耗信息不存在(AMD CPUs 提供相同的信息。我不知道 ARM 等其他制造商的情况,但会假设他们提供的信息较少)。最接近的是“MSR_PP0_ENERGY_STATUS”MSR,它(应该,在较新的 CPUs sans errata 上)给出所有内核组合消耗的 运行 焦耳计数,未知(未记录到我可以告诉)“更新之间的时间”并且无法跟踪历史信息。软件必须轮询此 MSR,因此软件只能获得平均值(轮询之间的时间)而不能确定瞬时值。
请注意,不应忽视不确定性原则 - 任何在软件中测量功耗的尝试都会产生增加功耗的开销。如果您想在 CPU/s 空闲时以高频率轮询 MSR(其中“测量”将导致被测量的功耗极度增加),这将尤其成问题。
我正在做动态电压和频率缩放 (DVFS) 算法的实验,需要在 Linux 内核中获取 CPU 内核的能耗。
我正在考虑使用 powercap Power Capping Framework.
这里是powercap_zone_ops结构powercap.h:
struct powercap_zone_ops {
int (*get_max_energy_range_uj) (struct powercap_zone *, u64 *);
int (*get_energy_uj) (struct powercap_zone *, u64 *);
int (*reset_energy_uj) (struct powercap_zone *);
int (*get_max_power_range_uw) (struct powercap_zone *, u64 *);
int (*get_power_uw) (struct powercap_zone *, u64 *);
int (*set_enable) (struct powercap_zone *, bool mode);
int (*get_enable) (struct powercap_zone *, bool *mode);
int (*release) (struct powercap_zone *);};
看起来get_energy_uj非常符合我的需求。要注册一个power zone,我需要使用struct device来描述我的CPU,但我不知道如何去做
如果有人能给我一些例子,这对我来说将是一个非常有价值的帮助。
谢谢!
有两种情况——较长时间的平均功耗(不能用于高频测量)和瞬时功耗(可以用于高频测量)。
对于第一种情况(较长时间段内的平均功耗),CPU 本身直到最近(也许是最近 5 年?)和大多数其他部分都没有任何支持电脑还是不支持。解决这些问题需要大量的工作来构建“每个硬件的最大功耗”(在驱动程序等中)的数据库,并编写代码以尝试根据负载估计硬件与最大值的接近程度给予;但没有 OS 支持这一点。此外(或作为替代);您可能能够从电源链 - 从外部 UPS 或笔记本电脑电池管理中获得“总体总功耗”(但如果您只关心 CPUs 的功耗,那是没用的) .
针对第二种情况;几乎没有硬件(几乎没有 CPUs)支持它。你必须估计它。对于 CPUs,估计瞬时功耗将涉及拦截所有功耗变化,这意味着拦截 software/voluntary 电源管理变化(通常是 CPUs 空闲的结果)和 hardware/involuntary 电源管理变化(通常是 CPUs 达到“最高温度”限制的结果)加上任何影响调度的东西(在任何时刻有多少内核在使用)加上像 AVX use/disuse (因为 CPU 在使用 AVX 时会消耗更多功率并降低其时钟频率)。当然也不OS支持这个。
但是;比那更糟。对于瞬时值,存在 latency/sampling 问题。如果您的软件每隔一段时间检查一次瞬时值,它将获得可能具有误导性的陈旧信息(例如,如果功耗在某些时刻 100W 和其他时刻 5W 之间波动,那么您可能只会看到“100W 样本”并且可能只会看到“5W样本”,无论哪种情况,您都无法判断样本是否具有误导性)。要解决该问题,您必须将数据存储为“持续时间”(许多“从开始时间到结束时间的功耗为..”条目的列表)并为“持续时间”设计interfaces/APIs;因此“持续时间”条目可用于在过去的任何时刻找到正确的值,准确估计未来时刻的值(不要忘记“现在(考虑到 123 纳秒的延迟)”相当于估计一个值即未来的 123 纳秒)并计算任何时间段内的平均值。再次;不 OS 也支持(甚至不支持其他更容易的事情)。
It looks like get_energy_uj perfectly meets my needs.
Powercap 是一种基于硬件 (Intel) 提供的便利(更便携、更易于访问)的抽象。
如果你深入研究 Intel 的手册,你会发现“每 CPU”或“每核”功耗信息不存在(AMD CPUs 提供相同的信息。我不知道 ARM 等其他制造商的情况,但会假设他们提供的信息较少)。最接近的是“MSR_PP0_ENERGY_STATUS”MSR,它(应该,在较新的 CPUs sans errata 上)给出所有内核组合消耗的 运行 焦耳计数,未知(未记录到我可以告诉)“更新之间的时间”并且无法跟踪历史信息。软件必须轮询此 MSR,因此软件只能获得平均值(轮询之间的时间)而不能确定瞬时值。
请注意,不应忽视不确定性原则 - 任何在软件中测量功耗的尝试都会产生增加功耗的开销。如果您想在 CPU/s 空闲时以高频率轮询 MSR(其中“测量”将导致被测量的功耗极度增加),这将尤其成问题。