电源限制框架

电源限制框架提供了内核和用户空间之间的一致接口,允许电源限制驱动程序以统一的方式向用户空间公开设置。

术语

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

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

示例 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

上面的示例说明了使用 Intel® IA-64 和 IA-32 处理器架构中提供的 Intel 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 封装,而子区域约束仅单独适用于给定封装的各个部分)。由于 Intel RAPL 不提供瞬时功率值,因此没有 power_uw 属性。

此外,每个电源区域都包含一个 name 属性,允许识别该区域代表的系统部分。例如

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

package-0

根据不同的电源区域,Intel 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 (rw)

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

max_energy_range_uj (ro)

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

power_uw (ro)

当前功率,单位为微瓦。

max_power_range_uw (ro)

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

name (ro)

此电源区域的名称。

某些域可能同时具有功率范围和能量计数器范围;但是,只有一个是强制性的。

约束

constraint_X_power_limit_uw (rw)

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

constraint_X_time_window_us (rw)

时间窗口,单位为微秒。

constraint_X_name (ro)

约束的可选名称

constraint_X_max_power_uw(ro)

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

constraint_X_min_power_uw(ro)

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

constraint_X_max_time_window_us(ro)

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

constraint_X_min_time_window_us(ro)

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

除了 power_limit_uw 和 time_window_us,其他字段都是可选的。

通用区域和控制类型属性

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

电源限制客户端驱动程序接口

API 摘要

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

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