使用 Manager 策略优化 Pod 性能
本指南为 Kubernetes 集群管理员提供了一份实用且可直接应用的手册,介绍如何启用和验证 CPU ManagerPolicy、Memory ManagerPolicy 和 Topology ManagerPolicy。通过协调 CPU 绑定、NUMA 亲和性和拓扑对齐,您可以为关键工作负载提供一致的延迟和更优的性能。
目录
范围和前提条件
角色和权限
- 需要维护窗口访问权限、
kubectl 管理权限以及节点的 SSH 访问权限。
工作负载要求
- 为实现专用 CPU 和 NUMA 亲和性,Pod 必须运行在 Guaranteed QoS 类别:requests = limits 且 CPU 以完整核数指定(例如 2、4)。
不涵盖内容
- HugePages 不在本指南范围内。如需 HugePages 支持,请联系您的支持团队。
快速开始:示例 Kubelet 配置
将以下片段添加到 /var/lib/kubelet/config.yaml,并根据您的环境调整数值:
# —— CPU ManagerPolicy ——
cpuManagerPolicy: "static" # 选项:none | static
cpuManagerPolicyOptions:
full-pcpus-only: "true" # 推荐:仅分配完整物理核
cpuManagerReconcilePeriod: "5s"
reservedSystemCPUs: "" # 例如 "0-1",如果为系统保留特定 CPU
# —— Memory ManagerPolicy ——
memoryManagerPolicy: "Static" # 选项:none | Static
reservedMemory:
- numaNode: 0
limits:
memory: "2048Mi"
- numaNode: 1
limits:
memory: "2048Mi"
# —— Topology ManagerPolicy ——
topologyManagerPolicy: "single-numa-node" # 选项:none | best-effort | restricted | single-numa-node
topologyManagerScope: "pod" # 选项:container | pod
说明:
full-pcpus-only: "true" 有助于提升延迟一致性。
topologyManagerScope: pod 确保同一 Pod 内的容器对齐到相同的 NUMA 拓扑。
reservedMemory 必须基于 kubelet 配置和驱逐阈值计算(详见下一节)。
如何计算 reservedMemory
计算公式:
R_total = kubeReserved(memory) + systemReserved(memory) + evictionHard(memory.available)
所有 NUMA 节点的 reservedMemory 之和必须等于 R_total。
步骤(针对 N 个 NUMA 节点):
-
计算 R_total(单位 Mi)。
-
计算商和余数:
- base = floor(R_total / N)
- rem = R_total − base × N
-
分配数值:
- NUMA 节点 0 = base + rem
- 其余 NUMA 节点 = base
示例(2 个 NUMA 节点):
- kubeReserved=512Mi,systemReserved=512Mi,evictionHard=100Mi → R_total = 1124Mi
- base = 562,rem = 0
reservedMemory:
- numaNode: 0
limits:
memory: "562Mi"
- numaNode: 1
limits:
memory: "562Mi"
应用配置
针对每个节点:
-
标记为不可调度并驱逐 Pod
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
-
停止 Kubelet 并清理状态
sudo systemctl stop kubelet
sudo rm -f /var/lib/kubelet/cpu_manager_state
sudo rm -f /var/lib/kubelet/memory_manager_state
-
重载守护进程并启动 Kubelet
sudo systemctl daemon-reload
sudo systemctl start kubelet
-
恢复节点调度
- 对于 DaemonSet 和系统 Pod,请显式重启或删除 Pod。
-
验证恢复状态
kubectl get nodes
kubectl get pods -A -o wide | grep <node>
验证
CPU ManagerPolicy 状态
sudo cat /var/lib/kubelet/cpu_manager_state | jq .
检查:
.policyName = "static"
.defaultCpuSet 列出非专用 CPU
.entries 显示容器与 CPU 的分配关系
Memory ManagerPolicy 状态
sudo cat /var/lib/kubelet/memory_manager_state | jq .
检查:
.policyName = "Static"
- 保留内存总和匹配
R_total
- Guaranteed Pod 根据
single-numa-node 策略分配到对应 NUMA 节点
关键策略和行为
CPU ManagerPolicy
- 目的:为 Guaranteed Pod 分配独占物理 CPU
- 配置:
cpuManagerPolicy: static,full-pcpus-only: "true"
- 行为:仅对 Guaranteed Pod 生效;Burstable/BestEffort 不受影响
Memory ManagerPolicy
- 目的:在 NUMA 节点级别预留并对齐内存
- 配置:
memoryManagerPolicy: "Static",reservedMemory
- 行为:与 Topology ManagerPolicy 配合效果最佳
Topology ManagerPolicy
- 目的:在单个 NUMA 节点上对齐 CPU、内存和设备分配
- 配置:
topologyManagerPolicy: single-numa-node,topologyManagerScope: pod
- 模式:best-effort、restricted、single-numa-node(严格)
术语
- NUMA node:非统一内存访问域
- CPU pinning:将容器绑定到专用 CPU
- NUMA affinity:优先使用与 CPU 同一 NUMA 节点的内存
- Topology alignment:将 CPU、内存和设备共置于同一 NUMA 节点
- Guaranteed Pod:requests = limits;CPU 以完整核数指定