CPU管理策略
使用场景
默认情况下,kubelet使用 CFS 配额 来执行Pod的CPU约束。 当节点上运行了很多CPU密集的Pod时,工作负载可能会迁移到不同的CPU核, 这取决于调度时Pod是否被扼制,以及哪些CPU核是可用的。许多应用对这种迁移不敏感,因此无需任何干预即可正常工作。有些应用对CPU敏感,CPU敏感型应用有如下特点。
- 对CPU throttling 敏感
- 对上下文切换敏感
- 对处理器缓存未命中敏感
- 对跨Socket内存访问敏感
- 期望运行在同一物理CPU的超线程
如果您的应用有以上其中一个特点,可以利用Kubernetes中提供的CPU管理策略为应用分配独占的CPU核(即CPU绑核),提升应用性能,减少应用的调度延迟。CPU manager会优先在一个Socket上分配资源,也会优先分配完整的物理核,避免一些干扰。
开启CPU管理策略
CPU 管理策略通过kubelet参数--cpu-manager-policy来指定。Kubernetes默认支持两种策略:
- 关闭(none):默认策略,显式地启用现有的默认CPU亲和方案,不提供操作系统调度器默认行为之外的亲和性策略。
- 开启(static):针对CPU申请值设置为整数的Guaranteed Pods ,它允许该类Pod中的容器访问节点上的独占CPU资源(绑核)。
在创建集群时的高级配置中可以配置CPU管理策略。
另外在节点池中也可以配置CPU管理策略,配置后会自动修改节点的上kubelet参数 --cpu-manager-policy。登录CCE控制台,单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签,单击节点池名称后的“更多 > 配置管理”,将cpu-manager-policy的值修改为static即可。
为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的效果。
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