英特尔 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