更新时间:2024-11-12 GMT+08:00

CPU管理策略

使用场景

默认情况下,kubelet使用CFS 配额来执行Pod的CPU约束。 当节点上运行了很多CPU密集的Pod时,工作负载可能会迁移到不同的CPU核, 这取决于调度时Pod是否被扼制,以及哪些CPU核是可用的。许多应用对这种迁移不敏感,因此无需任何干预即可正常工作。有些应用对CPU敏感,CPU敏感型应用有如下特点。

  • 对CPU throttling 敏感
  • 对上下文切换敏感
  • 对处理器缓存未命中敏感
  • 对跨Socket内存访问敏感
  • 期望运行在同一物理CPU的超线程

如果您的应用有以上其中一个特点,可以利用Kubernetes中提供的CPU管理策略为应用分配独占的CPU核(即CPU绑核),提升应用性能,减少应用的调度延迟。CPU manager会优先在一个Socket上分配资源,也会优先分配完整的物理核,避免一些干扰。

CPU管理策略通过kubelet参数--cpu-manager-policy来指定。Kubernetes默认支持两种策略:

  • none:默认策略,显式地启用现有的默认CPU亲和方案,不提供操作系统调度器默认行为之外的亲和性策略。
  • static:针对CPU申请值设置为整数的Guaranteed Pods ,它允许该类Pod中的容器访问节点上的独占CPU资源(绑核)。

约束与限制

弹性云服务器-物理机节点不支持使用CPU管理策略。

为集群开启CPU管理策略(DefaultPool中的节点)

在创建集群时的“高级配置”中可以选择开启CPU管理策略。

  • 开启:对应Kubernetes策略中的static,即使用CPU绑核。
  • 关闭:对应Kubernetes策略中的none,即不使用CPU绑核。

为自定义节点池开启CPU管理策略

您可以在自定义节点池中单独配置CPU管理策略,配置后会自动修改节点池中节点的上kubelet参数 --cpu-manager-policy。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧选择“节点管理”,在右侧选择“节点池”页签,单击节点池名称后的“更多 > 配置管理”
  3. 在侧边栏滑出的“配置管理”窗口中,修改kubelet组件的CPU管理策略配置(cpu-manager-policy)参数值,选择static

  4. 单击“确定”,完成配置操作。

为Pod设置独占CPU

Pod设置独占CPU(即CPU绑核)有如下几点要求:

在使用时您可以利用节点亲和调度将如上配置的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

验证

以8U16G节点为例,并提前在节点上部署一个CPU request为2,limit为2的工作负载。

登录到工作负载运行的节点,查看/var/lib/kubelet/cpu_manager_state输出内容。
cat /var/lib/kubelet/cpu_manager_state

回显如下:

{"policyName":"static","defaultCpuSet":"0-1,4-7","entries":{"de14506d-0408-411f-bbb9-822866b58ae2":{"container-1":"2-3"}},"checksum":3744493798}
  • policyName字段值为static代表策略设置成功。
  • 2-3代表该Pod中容器可以使用的CPU集合。