
# CPU管理策略
#### 使用场景
默认情况下，kubelet使用[CFS 配额](https://www.kernel.org/doc/html/next/scheduler/sched-design-CFS.html)来执行Pod的CPU约束。 当节点上运行了很多CPU密集的Pod时，工作负载可能会迁移到不同的CPU核， 这取决于调度时Pod是否被扼制，以及哪些CPU核是可用的。许多应用对这种迁移不敏感，因此无需任何干预即可正常工作。有些应用对CPU敏感，CPU敏感型应用有如下特点。
- 对CPU throttling 敏感
- 对上下文切换敏感
- 对处理器缓存未命中敏感
- 对跨Socket内存访问敏感
- 期望运行在同一物理CPU的超线程
如果您的应用有以上其中一个特点，可以利用Kubernetes中提供的[CPU管理策略](https://kubernetes.io/zh/docs/tasks/administer-cluster/cpu-management-policies/)为应用分配独占的CPU核（即CPU绑核），提升应用性能，减少应用的调度延迟。CPU manager会优先在一个Socket上分配资源，也会优先分配完整的物理核，避免一些干扰。
CPU管理策略通过kubelet参数*--cpu-manager-policy*来指定。Kubernetes默认支持两种策略：
- none：默认策略，显式地启用现有的默认CPU亲和方案，不提供操作系统调度器默认行为之外的亲和性策略。
- static：针对CPU申请值设置为整数的[Guaranteed Pods](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/quality-service-pod/) ，它允许该类Pod中的容器访问节点上的独占CPU资源（绑核）。
 
#### 约束与限制
- CCE Turbo集群的弹性云服务器-物理机节点不支持使用CPU管理策略。
- 在v1.34及以上版本集群中，如果您设置了Pod级别的资源申请或限制（[Pod级别资源规范（PodLevelResources）](https://kubernetes.io/blog/2025/09/22/kubernetes-v1-34-pod-level-resources/)特性），不支持同时使用静态CPU管理策略。
 
#### 设置CPU管理策略
您可以通过以下方式进行设置。
- [设置集群级别的CPU管理策略（支持DefaultPool中的节点）]
  
  在创建集群时，"高级配置"中可以选择开启CPU管理策略，该配置对整个集群生效。**集群创建完成后，不支持修改集群级别的CPU管理策略。**如果在创建集群时未开启此配置，则无法修改默认节点池（DefaultPool）中节点的CPU管理策略，您需要创建自定义节点池并使用节点级别的CPU管理策略。
  - 开启：对应Kubernetes策略中的static，即使用CPU绑核。
  
  - 关闭：对应Kubernetes策略中的none，即不使用CPU绑核。
  
  
  ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001999914080.png "点击放大")
- [设置节点池级别的CPU管理策略]
  
  您可以在自定义节点池中单独配置CPU管理策略，配置后会自动修改节点池中节点上的kubelet参数 --cpu-manager-policy。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  默认节点池（DefaultPool）遵循集群级别的CPU管理策略，不支持修改此配置。
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 在左侧选择"节点管理"，在右侧选择"节点池"页签，单击节点池名称后的"更多 \> 配置管理"。
  
  3. 在侧边栏滑出的"配置管理"窗口中，修改kubelet组件的CPU管理策略配置（cpu-manager-policy）参数值，选择**static** 。
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002005934334.png "点击放大")
     
     
  
  4. 单击"确定"，完成配置操作。
   
#### 为Pod设置独占CPU
Pod设置独占CPU（即CPU绑核）有如下几点要求：
- 节点上开启静态（static）CPU管理策略，具体方法请参见[设置集群级别的CPU管理策略（支持DefaultPool中的节点）]。
- Pod的定义里都要设置requests和limits参数，requests和limits必须为整数，且数值一致。
在使用时您可以利用[节点亲和调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0892.html)将如上配置的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集合。
 
