更新时间:2024-08-17 GMT+08:00
增强型CPU管理策略
在Kubernetes默认提供的CPU管理策略中有none和static两种:
- none: 默认不开启CPU管理策略,表示现有的调度行为。
- static:开启静态绑核的CPU管理策略,允许为节点上具有某些资源特征的 Pod(Guaranteed pod)赋予增强的 CPU 亲和性和独占性。
增强型CPU管理策略(enhanced-static),是在兼容静态绑核CPU管理策略的基础上,新增一种符合某些资源特征的Burstable Pod(要求CPU的requests和limits参数值都是正整数)优先使用某些CPU的能力,以减少应用在多个CPU间频繁切换带来的影响。能够使用优先使用CPU的Burstable Pod举例如下:
... spec: containers: - name: nginx image: nginx resources: limits: memory: "300Mi" cpu: "2" requests: memory: "200Mi" cpu: "1"
该特性是基于Huawei Cloud EulerOS 2.0内核中优化了CPU调度能力实现的。在Pod容器优先使用的CPU利用率超过85%时,会自动分配到其他利用率较低的CPU上,进而保障了应用的响应能力。
- 开启增强型CPU管理策略时,应用性能优于不开启CPU管理策略(none),但弱于静态CPU管理策略(static)。
- 应用分配的优先使用的CPU并不会被独占,仍处于共享的CPU池中。因此在该Pod处于业务波谷时,节点上其他Pod可使用该部分CPU资源。
约束与限制
使用该特性,需同时满足以下条件:
- 集群版本为v1.23及以上。
- 节点操作系统为Huawei Cloud EulerOS 2.0。
- 弹性云服务器-物理机节点不支持使用CPU管理策略。
操作步骤
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。
- 选择一个操作系统为Huawei Cloud EulerOS 2.0的节点池,单击节点池名称后的“配置管理”。
- 在侧边栏滑出的“配置管理”窗口中,修改kubelet组件的CPU管理策略配置(cpu-manager-policy)参数值,选择enhanced-static。
图1 CPU管理策略配置
- 单击“确定”,完成配置操作。
验证
以8U32G节点为例,并提前在集群中部署一个CPU request为1,limit为2的工作负载。
- 登录到节点池中的一个节点,查看/var/lib/kubelet/cpu_manager_state输出内容。
cat /var/lib/kubelet/cpu_manager_state
回显如下:
{"policyName":"enhanced-static","defaultCpuSet":"0,2-7","entries":{"6739f6f2-ebe5-48ae-945a-986d5d8919b9":{"container-1":"0-7,10001"}},"checksum":1638128523}
- policyName字段值为enhanced-static代表策略设置成功。
- 优先使用CPU号将10000作为基数,本例中10001即代表容器使用的亲和CPU号为1,0-7代表该Pod中容器可以使用的CPU集合。
- 查看容器的cpuset.preferred_cpus的cgroup设置,输出内容即为优先使用的CPU号。
cat /sys/fs/cgroup/cpuset/kubepods/burstable/pod{pod uid}/{容器id}/cpuset.preferred_cpus
- {pod uid}为Pod UID,可在已通过kubectl连接集群的机器上使用以下命令获取:
kubectl get po {pod name} -n {namespace} -ojsonpath='{.metadata.uid}{"\n"}'
命令中的{pod name}和{namespace}是Pod名称及其所在的命名空间。
- {容器id}需要是完整的容器ID,可在容器运行的节点上通过以下命令获取:
docker节点池:命令中的{pod name}是Pod名称。
docker ps --no-trunc | grep {pod name} | grep -v cce-pause | awk '{print $1}'
containerd节点池:命令中的{pod name}是Pod名称,{pod id}是Pod的ID,{container name}是容器名称。
# 获取Pod ID crictl pods | grep {pod name} | awk '{print $1}' # 获取完整容器ID crictl ps --no-trunc | grep {pod id} | grep {container name} | awk '{print $1}'
完整示例如下:
cat /sys/fs/cgroup/cpuset/kubepods/burstable/pod6739f6f2-ebe5-48ae-945a-986d5d8919b9/5ba5603434b95fd22d36fba6a5f1c44eba83c18c2e1de9b52ac9b52e93547a13/cpuset.preferred_cpus
回显如下,表示优先使用1号CPU。
1
- {pod uid}为Pod UID,可在已通过kubectl连接集群的机器上使用以下命令获取: