Kubernetes v1.34:为 CPU Manager 静态策略引入 Uncore 缓存对齐选项
Kubernetes v1.32 中引入了一个名为 prefer-align-cpus-by-uncorecache
的新 CPU Manager Static 策略选项,作为 Alpha 特性,并在 Kubernetes v1.34 中进阶至 beta 阶段。此 CPU Manager 策略选项旨在优化在具有 split uncore cache(分裂非核心缓存) 架构的处理器上运行的特定工作负载的性能。在本文中,我将解释这意味着什么以及它为何有用。
了解此特性
什么是 uncore cache?
直到最近,几乎所有主流计算机处理器都具有一个在多个 CPU 封装中所有核心共享的单片(monolithic)末级缓存。这种单片缓存也称为 uncore cache(因为它不与特定核心相关联),或 L3 缓存。除了 L3 缓存外,还有其他缓存,通常称为 L1 和 L2 缓存,它们 是 与特定 CPU 核心关联的。
为了减少 CPU 核心与其缓存之间的访问延迟,近期的 AMD64 和 ARM 架构处理器引入了 split uncore cache(分裂非核心缓存) 架构,其中末级缓存被分为多个物理缓存,这些缓存与物理封装内的特定 CPU 分组对齐。CPU 封装内较短的距离有助于减少延迟。
Kubernetes 能够以考虑 CPU 封装内缓存拓扑的方式来放置工作负载。
感知缓存的工作负载放置
下面的矩阵显示了在使用分裂非核心缓存的处理器上,通过其缓存一致性协议在 CPU 之间传递数据包时测量的 CPU-to-CPU 延迟(以纳秒为单位,越低越好)。在此示例中,处理器封装包含 2 个非核心缓存。每个非核心缓存服务 8 个 CPU 核心。 矩阵中的蓝色条目表示共享相同非核心缓存的 CPU 之间的延迟,而灰色条目表示对应于不同非核心缓存的 CPU 之间的延迟。对应于不同缓存的 CPU 之间的延迟高于属于同一缓存的 CPU 之间的延迟。
启用 prefer-align-cpus-by-uncorecache
后,静态 CPU Manager 会尝试为容器分配 CPU 资源,使得分配给一个容器的所有 CPU 共享相同的非核心缓存。此策略以尽力而为的方式运行,旨在根据容器的需求,并考虑到节点上的可分配资源,最大限度地减少容器的 CPU 资源在不同非核心缓存间的分布。
通过在一组使用尽可能少的非核心缓存的 CPU 上运行工作负载,应用程序可以从减少的缓存延迟(如上矩阵所示)和减少与其他工作负载的争用中受益,从而实现更高的总体吞吐量。只有当你的节点处理器使用分裂非核心缓存拓扑时,这种好处才会显现。
下图说明了启用该功能时的非核心缓存对齐情况。
默认情况下,Kubernetes 不考虑非核心缓存拓扑;容器使用密集打包(packed)的方法分配 CPU 资源。因此,容器 1 和容器 2 可能会因非核心缓存 0 上的缓存访问争用而遭受“吵闹邻居”的影响。此外,容器 2 的 CPU 将分布在两个缓存上,这可能引入跨缓存的延迟。
启用 prefer-align-cpus-by-uncorecache
后,每个容器都被隔离在单个缓存上。这解决了容器之间的缓存争用,并最大限度地减少了所用 CPU 的缓存延迟。
使用场景
常见用例可以包括电信应用,如 vRAN、移动分组核心和防火墙。需要注意的是,prefer-align-cpus-by-uncorecache
提供的优化可能依赖于具体的工作负载。例如,受内存带宽限制的应用程序可能无法从非核心缓存对齐中受益,因为使用更多的非核心缓存可以增加内存带宽访问。
启用该特性
要启用此功能,请将 CPU Manager 策略设置为 static
,并使用 prefer-align-cpus-by-uncorecache
启用 CPU Manager 策略选项。
对于 Kubernetes 1.34,该功能处于 Beta 阶段,还需要启用 CPUManagerPolicyBetaOptions
特性门控。
将以下内容附加到 kubelet 配置文件中
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
featureGates:
...
CPUManagerPolicyBetaOptions: true
cpuManagerPolicy: "static"
cpuManagerPolicyOptions:
prefer-align-cpus-by-uncorecache: "true"
reservedSystemCPUs: "0"
...
如果你在现有节点上进行此更改,请删除 cpu_manager_state
文件,然后重启 kubelet。
prefer-align-cpus-by-uncorecache
可以在具有单片非核心缓存处理器的节点上启用。该功能将模拟尽力而为的插槽对齐效果,并将像默认的静态 CPU Manager 策略一样在插槽上密集打包 CPU 资源。
进一步阅读
请参阅节点资源管理器以了解有关 CPU Manager 和可用策略的更多信息。
在此处引用 prefer-align-cpus-by-uncorecache
的文档。
有关 prefer-align-cpus-by-uncorecache
如何实现的更多信息,请参阅 Kubernetes 增强提案。
参与进来
此功能由 SIG Node 推动。如果你有兴趣帮助开发此功能、分享反馈或参与任何其他正在进行的 SIG Node 项目,请参加 SIG Node 会议以获取更多详细信息。