云服务器内容精选

  • 验证 以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
  • 操作步骤 登录CCE控制台。 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 选择一个操作系统为Huawei Cloud EulerOS 2.0的节点池,单击节点池名称后的“配置管理”。 在侧边栏滑出的“配置管理”窗口中,修改kubelet组件的CPU管理策略配置(cpu-manager-policy)参数值,选择enhanced-static。 图1 CPU管理策略配置 单击“确定”,完成配置操作。
  • 使用场景 默认情况下,kubelet使用 CFS 配额 来执行Pod的CPU约束。 当节点上运行了很多CPU密集的Pod时,工作负载可能会迁移到不同的CPU核, 这取决于调度时Pod是否被扼制,以及哪些CPU核是可用的。许多应用对这种迁移不敏感,因此无需任何干预即可正常工作。有些应用对CPU敏感,CPU敏感型应用有如下特点。 对CPU throttling 敏感 对上下文切换敏感 对处理器缓存未命中敏感 对跨Socket内存访问敏感 期望运行在同一物理CPU的超线程 如果您的应用有以上其中一个特点,可以利用Kubernetes中提供的CPU管理策略为应用分配独占的CPU核(即CPU绑核),提升应用性能,减少应用的调度延迟。CPU manager会优先在一个Socket上分配资源,也会优先分配完整的物理核,避免一些干扰。
  • 为Pod设置独占CPU Pod设置独占CPU(即CPU绑核)有如下几点要求: 节点上开启静态(static)CPU管理策略,具体方法请参见开启CPU管理策略。 Pod的定义里都要设置requests和limits参数,requests和limits必须为整数,且数值一致。 如果有init container需要设置独占CPU,init container的requests参数建议与业务容器设置的requests参数一致(避免业务容器未继承init container的CPU分配结果,导致CPU manager多预留一部分CPU)。更多信息请参见App Containers can't inherit Init Containers CPUs - CPU Manager Static Policy。 在使用时您可以利用调度策略(亲和与反亲和)将如上配置的Pod调度到开启静态(static)CPU管理策略的节点上,这样就能够达到独占CPU的效果。 设置独占CPU的YAML示例如下: kind: Deployment apiVersion: apps/v1 metadata: name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: container-1 image: nginx:alpine resources: requests: cpu: 2 # 必须为整数,且需要与limits中一致 memory: 2048Mi limits: cpu: 2 # 必须为整数,且需要与requests中一致 memory: 2048Mi imagePullSecrets: - name: default-secret