功耗限制框架

功耗限制框架在内核和用户空间之间提供了一致的接口,使功耗限制驱动程序能够以统一的方式向用户空间公开设置。

术语

该框架通过 sysfs 以对象树的形式向用户空间公开功耗限制设备。树根级别的对象表示“控制类型”,对应于不同的功耗限制方法。例如,intel-rapl 控制类型表示英特尔“运行平均功耗限制”(RAPL)技术,而“空闲注入”控制类型则对应于使用空闲注入来控制功耗。

功耗区域代表系统的不同部分,可以使用给定区域所属的控制类型所确定的功耗限制方法进行控制和监控。每个功耗区域都包含用于监控功耗的属性,以及以功耗约束形式表示的控制。如果不同功耗区域所代表的系统部分是分层的(即,一个较大的部分由多个较小的部分组成,每个部分都有自己的功耗控制),则这些功耗区域也可以分层组织,其中一个父功耗区域包含多个子区域,以此类推,以反映系统的功耗控制拓扑。在这种情况下,可以使用父功耗区域对一组设备一起应用功耗限制,如果需要更精细的控制,则可以通过子区域进行应用。

sysfs 接口树示例

/sys/devices/virtual/powercap
└──intel-rapl
    ├──intel-rapl:0
    │   ├──constraint_0_name
    │   ├──constraint_0_power_limit_uw
    │   ├──constraint_0_time_window_us
    │   ├──constraint_1_name
    │   ├──constraint_1_power_limit_uw
    │   ├──constraint_1_time_window_us
    │   ├──device -> ../../intel-rapl
    │   ├──energy_uj
    │   ├──intel-rapl:0:0
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:0
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──intel-rapl:0:1
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:0
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──max_energy_range_uj
    │   ├──max_power_range_uw
    │   ├──name
    │   ├──enabled
    │   ├──power
    │   │   ├──async
    │   │   []
    │   ├──subsystem -> ../../../../../class/power_cap
    │   ├──enabled
    │   ├──uevent
    ├──intel-rapl:1
    │   ├──constraint_0_name
    │   ├──constraint_0_power_limit_uw
    │   ├──constraint_0_time_window_us
    │   ├──constraint_1_name
    │   ├──constraint_1_power_limit_uw
    │   ├──constraint_1_time_window_us
    │   ├──device -> ../../intel-rapl
    │   ├──energy_uj
    │   ├──intel-rapl:1:0
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:1
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──intel-rapl:1:1
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:1
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──max_energy_range_uj
    │   ├──max_power_range_uw
    │   ├──name
    │   ├──enabled
    │   ├──power
    │   │   ├──async
    │   │   []
    │   ├──subsystem -> ../../../../../class/power_cap
    │   ├──uevent
    ├──power
    │   ├──async
    │   []
    ├──subsystem -> ../../../../class/power_cap
    ├──enabled
    └──uevent

上述示例说明了使用英特尔® IA-64 和 IA-32 处理器架构中可用的英特尔 RAPL 技术的情况。有一个名为 intel-rapl 的控制类型,它包含两个功耗区域,intel-rapl:0 和 intel-rapl:1,分别代表 CPU 封装。这些功耗区域中的每一个都包含两个子区域,intel-rapl:j:0 和 intel-rapl:j:1(j = 0, 1),分别代表给定 CPU 封装的“核心”和“非核心”部分。所有区域和子区域都包含能量监控属性 (energy_uj, max_energy_range_uj) 和约束属性 (constraint_*),允许应用控制(“封装”功耗区域中的约束适用于整个 CPU 封装,而子区域约束仅分别适用于给定封装的各个部分)。由于英特尔 RAPL 不提供瞬时功耗值,因此没有 power_uw 属性。

此外,每个功耗区域都包含一个名称属性,允许识别该区域所代表的系统部分。例如:

cat /sys/class/power_cap/intel-rapl/intel-rapl:0/name

package-0

根据不同的功耗区域,英特尔 RAPL 技术允许将一个或多个约束(如短期、长期和峰值功耗)以及不同的时间窗口应用于每个功耗区域。所有区域都包含表示约束名称、功耗限制和时间窗口大小的属性。请注意,时间窗口不适用于峰值功耗。这里,constraint_j_* 属性对应于第 j 个约束(j = 0,1,2)。

例如:

constraint_0_name
constraint_0_power_limit_uw
constraint_0_time_window_us
constraint_1_name
constraint_1_power_limit_uw
constraint_1_time_window_us
constraint_2_name
constraint_2_power_limit_uw
constraint_2_time_window_us

功耗区域属性

监控属性

energy_uj (读写)

当前能量计数器,单位微焦。写入“0”复位。如果计数器无法复位,则此属性为只读。

max_energy_range_uj (只读)

上述能量计数器的范围,单位微焦。

power_uw (只读)

当前功耗,单位微瓦。

max_power_range_uw (只读)

上述功耗值的范围,单位微瓦。

name (只读)

此功耗区域的名称。

某些域可能同时具有功耗范围和能量计数器范围;但是,其中一个为必选。

约束

constraint_X_power_limit_uw (读写)

功耗限制,单位微瓦,应适用于“constraint_X_time_window_us”指定的时间窗口。

constraint_X_time_window_us (读写)

时间窗口,单位微秒。

constraint_X_name (只读)

约束的可选名称

constraint_X_max_power_uw(只读)

允许的最大功耗,单位微瓦。

constraint_X_min_power_uw(只读)

允许的最小功耗,单位微瓦。

constraint_X_max_time_window_us(只读)

允许的最大时间窗口,单位微秒。

constraint_X_min_time_window_us(只读)

允许的最小时间窗口,单位微秒。

除 power_limit_uw 和 time_window_us 之外,其他字段均为可选。

通用区域和控制类型属性

enabled (读写): 在区域级别或使用控制类型对所有区域启用/禁用控制。

功耗限制客户端驱动接口

API 摘要

调用 powercap_register_control_type() 注册控制类型对象。调用 powercap_register_zone() 注册功耗区域(在给定控制类型下),可以作为顶层功耗区域,也可以作为先前注册的另一个功耗区域的子区域。在调用 powercap_register_zone() 注册该区域之前,必须定义功耗区域中的约束数量和相应的回调函数。

要释放功耗区域,请调用 powercap_unregister_zone()。要释放控制类型对象,请调用 powercap_unregister_control_type()。可以使用 kernel-doc 在 include/linux/powercap.h 上生成详细的 API 文档。