Intel Uncore 频率调节

版权所有:

© 2022-2023 Intel Corporation

作者:

Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

简介

根据工作负载的特性,uncore 在 Intel 的 Xeon 服务器中会消耗大量的电能。为了优化总功耗并提高整体性能,SoC 具有用于调节 uncore 频率的内部算法。这些算法会监视 uncore 的工作负载使用情况并设置所需的频率。

用户可能对 uncore 性能有不同的期望,并且希望对其进行控制。其目标类似于允许用户通过 cpufreq sysfs 设置频率调节的最小/最大频率以提高 CPU 性能。用户可能有一些对延迟敏感的工作负载,他们不希望 uncore 频率发生任何变化。此外,用户可能有一些工作负载需要在不同的阶段具有不同的核心和 uncore 性能,并且他们可能希望使用 cpufreq 和 uncore 调节接口来分配功耗并提高整体性能。

Sysfs 接口

为了控制 uncore 频率,在目录 /sys/devices/system/cpu/intel_uncore_frequency/ 中提供了一个 sysfs 接口。

对于每个封装和晶片的组合,都有一个目录,因为 uncore 调节控制的范围是每个封装中多个晶片的每个晶片,或者是每个封装单个晶片的每个封装。名称代表控制的范围。例如:“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。

die_id

此属性用于获取此实例的 Linux 晶片 ID。此属性仅适用于具有核心代理的域,并且当 CPUID 叶 0x1f 显示晶片 ID 时。

fabric_cluster_id

此属性用于获取此实例的结构集群 ID。

package_id

此属性用于获取此实例的封装 ID。

agent_types

此属性显示域中存在的所有硬件代理。每个代理都有能力控制一个或多个硬件子系统,包括:核心、缓存、内存和 I/O。

其他属性与 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) 功能提高了每瓦性能。借助此功能,硬件电源管理算法可以优化延迟和功耗之间的权衡。对于某些对延迟敏感的工作负载,可以通过 SW 进行进一步调整以获得所需的性能。

硬件会定期监视电源域中所有内核的平均 CPU 利用率,并确定 uncore 频率。虽然这可能会带来最佳的每瓦性能,但工作负载可能希望以功耗为代价获得更高的性能。考虑一个间歇性唤醒以在空闲系统上执行内存读取的应用程序。在这种情况下,如果硬件降低 uncore 频率,则频率的提升可能存在延迟,无法满足目标性能。

ELC 控制定义了一些可以从 SW 更改的参数。如果平均 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