对于自 Skylake 以来在其服务器上使用英特尔的 sub-NUMA 集群 (SNC) 配置选项的用户,正在改进 Linux 资源控制“resctrl”内核代码以更好地处理此资源配置。
子 NUMA 集群允许将 CPU 的核心/缓存/内存控制器划分为多个 NUMA 域。子 NUMA 集群可能有利于 NUMA 感知/优化软件,类似于 AMD 的 NUMA Per Socket (NPS) BIOS 选项。虽然它已经可用多年并且在 Linux 上运行良好以实现预期的功能,但事实证明,当前的 Linux 内核资源控制系统在启用 SNC 时错误地处理了 Resource Director Technology (RDT) 监控。
长期担任 Intel Linux 工程师的 Tony Luck 解释了这个新的补丁系列,旨在改进对 Sub-NUMA 集群服务器的资源控制支持:
从 Skylake 开始的英特尔服务器系统支持一种对每个插槽进行逻辑分区的模式。例如,当以两种方式分区时,一半的核心、L3 缓存和内存控制器被分配给每个分区。这可以减少访问 L3 缓存和内存的平均延迟,代价是只有一半的 L3 缓存可用于子节点本地内存访问。
现有的 Linux resctrl 系统在启用 SNC 模式的系统上错误地处理了 RDT 监控。
但是,通过一些简单的更改,就可以解决这个问题。当启用 SNC 模式时,RDT RMID 计数器也被分区,低编号计数器进入第一个分区,高编号计数器进入第二个分区。关键是调整在上下文切换时写入 IA32_PQR_ASSOC MSR 的 RMID 值,以及在读取计数器时写入 IA32_QM_EVTSEL 的值,并更改从 CPUID(0xf,1).EBX 读取的比例因子,
例如 2 -way Sub-NUMA 集群有 200 个 RMID 计数器,resctrl 代码只有 100 个可用计数器。当在第一个 SNC 节点上运行时,RMID 值 0..99 像以前一样使用。但是当在第二个节点上运行时,分配了 resctrl rmid=10 的任务必须将 10+100 加载到 IA32_PQR_ASSOC 中才能使用 RMID 计数器 110。
其他架构或禁用 SNC(其中 snc_ways == 1)的 Intel 系统上的功能应该没有变化。
此当前行为或提议的更改不应影响 SNC 性能,而是关于解决对子 NUMA 集群配置的适当资源控制监视。修正 x86/resctrl 代码的七个补丁现已发布以供审核。