英特尔 Uncore 频率调节¶
- 版权:
© 2022-2023 英特尔公司
- 作者:
Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
介绍¶
根据工作负载特性,uncore 在英特尔 Xeon 服务器中会消耗大量电能。为了优化总功耗并提高整体性能,SoC 具有用于调节 uncore 频率的内部算法。这些算法会监控 uncore 的工作负载使用情况并设置理想的频率。
用户可能对 uncore 性能有不同的期望,并希望对其进行控制。目标与允许用户通过 cpufreq sysfs 设置缩放最小/最大频率以提高 CPU 性能类似。用户可能有一些对延迟敏感的工作负载,他们不希望 uncore 频率发生任何变化。此外,用户可能有一些工作负载需要在不同的阶段需要不同的内核和 uncore 性能,他们可能希望使用 cpufreq 和 uncore 缩放接口来分配电能并提高整体性能。
Sysfs 接口¶
为了控制 uncore 频率,在目录 /sys/devices/system/cpu/intel_uncore_frequency/ 中提供了一个 sysfs 接口。
每个封装和芯片组合都有一个目录,因为 uncore 缩放控制的范围是多芯片/封装 SoC 中的每个芯片,或每个封装只有一个芯片的 SoC 的每个封装。名称表示控制范围。例如:“package_00_die_00” 表示封装 id 为 0 和芯片 0。
每个 package_*_die_* 都包含以下属性
initial_max_freq_khz
在复位时,此属性表示最大可能的频率。这是一个只读属性。如果用户调整了 max_freq_khz,他们始终可以使用此属性中的值返回最大值。
initial_min_freq_khz
在复位时,此属性表示最小可能的频率。这是一个只读属性。如果用户调整了 min_freq_khz,他们始终可以使用此属性中的值返回最小值。
max_freq_khz
此属性用于设置最大 uncore 频率。
min_freq_khz
此属性用于设置最小 uncore 频率。
current_freq_khz
此属性用于获取当前 uncore 频率。
支持 TPMI(拓扑感知寄存器和 PM 胶囊接口)的 SoC¶
SoC 可以包含多个具有单独或一组网格分区的电源域。此分区称为结构集群。
某些类型的网格需要以相同的频率运行,它们将被放置在同一个结构集群中。结构集群的优点是它提供了一种可扩展的机制来处理 SoC 中分区后的结构。
当前的 sysfs 接口支持在封装和芯片级别的控制。此接口不足以支持在结构集群级别进行更精细的控制。
支持 TPMI(拓扑感知寄存器和 PM 胶囊接口)的 SoC 可以有多个电源域。每个电源域可以包含一个或多个结构集群。
为了在结构集群级别表示控件,并补充在封装和芯片级别(例如不支持 TPMI 的系统)的控件,sysfs 得到了增强。此精细接口在 sysfs 中以名称前缀为 “uncore” 的目录显示。例如:uncore00、uncore01 等。
控制范围由目录中的属性 “package_id”、“domain_id” 和 “fabric_cluster_id” 指定。
每个目录中的属性
domain_id
此属性用于获取此实例的电源域 id。
fabric_cluster_id
此属性用于获取此实例的结构集群 id。
package_id
此属性用于获取此实例的封装 id。
其他属性与 package_*_die_* 级别显示的属性相同。
在当前的大多数用例中,“max_freq_khz” 和 “min_freq_khz” 在 “package_*_die_*” 级别更新。此模型仍然会通过以下方法支持
当用户使用 “package_*_die_*” 级别的控件时,该封装和芯片中的每个结构集群都会受到影响。例如:用户更改 package_00_die_00 中的 “max_freq_khz”,则具有相同封装 id 的 uncore* 目录的 “max_freq_khz” 将被更新。在这种情况下,用户仍然可以在每个 uncore* 级别更新 “max_freq_khz”,这更具限制性。同样,用户可以在 “package_*_die_*” 级别更新 “min_freq_khz” 以应用于每个 uncore* 级别。
对 “current_freq_khz” 的支持仅在每个结构集群级别(即在 uncore* 目录中)可用。
效率与延迟的权衡¶
效率延迟控制 (ELC) 功能提高了每瓦性能。借助此功能,硬件电源管理算法可以优化延迟和功耗之间的权衡。对于某些延迟敏感的工作负载,可以通过软件进行进一步调整以获得所需的性能。
硬件会定期监控电源域中所有内核的平均 CPU 利用率,并决定 uncore 频率。虽然这可能会带来最佳的每瓦性能,但工作负载可能希望以功耗为代价获得更高的性能。考虑一个间歇性唤醒以在其他空闲系统上执行内存读取的应用程序。在这种情况下,如果硬件降低 uncore 频率,则可能会延迟频率的提升以满足目标性能。
ELC 控制定义了一些可以从软件更改的参数。如果平均 CPU 利用率低于用户定义的阈值(下面的 elc_low_threshold_percent 属性),则将使用用户定义的 uncore 最低频率(下面的 elc_floor_freq_khz 属性)而不是硬件计算的最小值。
同样,在高负载情况下,当 CPU 利用率高于高阈值时(下面的 elc_high_threshold_percent 属性),频率将以 100MHz 的步长增加,而不是跳转到最大 uncore 频率。这避免了 CPU 利用率峰值立即消耗不必要的高电能。
效率延迟控制的属性
elc_floor_freq_khz
此属性用于获取/设置效率延迟最低频率。如果此变量低于“min_freq_khz”,则固件会忽略它。
elc_low_threshold_percent
此属性用于获取/设置效率延迟控制低阈值。此属性以 CPU 利用率的百分比表示。
elc_high_threshold_percent
此属性用于获取/设置效率延迟控制高阈值。此属性以 CPU 利用率的百分比表示。
elc_high_threshold_enable
此属性用于启用/禁用效率延迟控制高阈值。写入“1”以启用,写入“0”以禁用。
- 下面的示例系统配置执行以下操作
当 CPU 利用率低于 10% 时:将 uncore 频率设置为 800MHz
当 CPU 利用率高于 95% 时:以 100MHz 的步长增加 uncore 频率,直到达到功率限制
elc_floor_freq_khz:800000 elc_high_threshold_percent:95 elc_high_threshold_enable:1 elc_low_threshold_percent:10