
# 低优先级工作负载CPU限流
在混部环境中，高优先级（在线）和低优先级（离线）工作负载被部署在同一节点上，以提高资源利用率。然而，离线工作负载可能会消耗过多CPU资源，从而影响在线工作负载的性能。
CPU限流功能限制离线工作负载的CPU使用，可以保护在线工作负载的性能。CPU限流功能根据节点可分配CPU和实时CPU使用情况，动态调整BestEffort的CPU配额。其功能包含：
- **配额预算（Quota Budgeting）**：基于可分配 CPU 减去实时 CPU 使用量，计算 BE（BestEffort）CPU 配额预算。
- **抖动控制（Jitter Control）**：使用抖动限制百分比，避免因微小变化而频繁更新。
- **QoS 感知（QoS Awareness）**：仅对 BE cgroup 应用限流；更高优先级的工作负载通过 request 计量得到保护。
- **运行时可配置（Runtime Configurability）**：支持动态配置更新，以实现灵活适配。
#### 前提条件
- 集群版本：CCE Turbo集群且集群版本为v1.29及以上。
- OS版本：Huawei Cloud EulerOS 2.0及以上 。
- 集群中需要安装Volcano 1.22.1及以上版本的插件，且开启混合部署开关。
 
#### 约束与限制
该功能与资源超卖功能绑定。约束离线Pod不允许申请cpu、memory资源，而是用kubernetes.io/batch-cpu、kubernetes.io/batch-memory代替。
#### 配置示例
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"节点管理"，在需要开启动态资源超卖的节点池中，单击"更多 \> 混部配置"。 
   确认"节点池混部开关"及"资源超卖"开关已打开，详情请参见[云原生混部配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0708.html#cce_10_0708__section19689248184019)。
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002563089080.png "点击放大")
   
   
3. 开启CPU限流能力，运行以下命令行。 
   ```
   kubectl edit cm -n kube-system  volcano-agent-configuration
   ```
   在nodesConfig中加上以下示例关于cpuThrottlingConfig的配置：
   ```
   "cpuThrottlingConfig": {
     "enable": true,
     "cpuThrottlingThreshold": 80,    # 允许 BE 配额最多占可分配 CPU 的 80%
     "cpuJitterLimitPercent": 1,      # 当配额变化 >=1% 时触发更新
     "cpuRecoverLimitPercent": 10    # 每次更新时配额增长最多为 10%
   }
   ```
   - cpuThrottlingThreshold：允许BE配额最多占可分配CPU的比例。
   
   - cpuJitterLimitPercent：触发配额更新的最小百分比，例如配置为1表示当配额变化\>=1%时触发更新。
   
   - cpuRecoverLimitPercent：每次更新配额最大百分比，例如配置为10表示每次更新时配额增长最多为10%。
   
   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002593842711.png "点击放大")
   
   
4. 查看节点cgroup路径下besteffort文件更新情况，更新成功 （计算的值约为节点**allocatable\*cpuThrottlingThreshold% - cpuUsage** ）：
   
   ```
   cat "/sys/fs/cgroup/kubepods/besteffort/cpu.max"
   ```
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002593723463.png "点击放大")
   cpu.max文件的内容通常包含两个值，格式如下：
   ```
   <quota> <period>
   ```
   - **quota**：表示容器在每个周期内可以使用的CPU时间（以微秒为单位）。
   
   - **period**：表示周期的长度（以微秒为单位）。默认值通常是100000微秒（即100毫秒）。
   
   
   CPU限制值可通过**quota/period**进行计算，如示例中154300/100000=1.543核。
   
   
 
#### 验证
1. 下发高优先级作业使用CPU、Memory资源，和低优先级作业使用kubernetes.io/batch-cpu、kubernetes.io/batch-memory资源： 
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: press
     namespace: default
     labels:
       app: press
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: press
     strategy:
       type: RollingUpdate
       rollingUpdate:
         maxUnavailable: 1
         maxSurge: 1
     template:
       metadata:
         labels:
           app: press
       spec:
         containers:
         - name: test
           image: your-image  # 高优先级作业
           imagePullPolicy: IfNotPresent
           resources:
             requests:
               cpu: "250m"
               memory: "512Mi"
             limits:
               cpu: "2"
               memory: "512Mi"
   ---
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: cputhrottle
     namespace: default
     labels:
       app: cputhrottle
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: cputhrottle
     strategy:
       type: RollingUpdate
       rollingUpdate:
         maxUnavailable: 1
         maxSurge: 1
     template:
       metadata:
         labels:
           app: cputhrottle
       spec:
         containers:
         - name: test
           image: your-image  # 低优先级作业
           imagePullPolicy: IfNotPresent
           resources:
             requests:
               kubernetes.io/batch-cpu: "1"
               kubernetes.io/batch-memory: "512Mi"
             limits:
               kubernetes.io/batch-cpu: "4"
               kubernetes.io/batch-memory: "512Mi"
   ```
   
   
2. 先对低优先级作业Pod进行CPU加压，使用以下命令观察Pod对CPU资源使用情况（需要安装Kubernetes Metrics Server插件，安装方式详见 [Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html) ）。
   
   ```
   kubectl top pod
   ```
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002563244328.png "点击放大")
   给节点加压后，可观察到cpu.max文件会刷新：
   ```
   cat "/sys/fs/cgroup/kubepods/besteffort/cpu.max"
   ```
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002563084702.png "点击放大")
   
   
3. 再对高优先级作业Pod进行CPU加压，一段时间后观察对CPU资源使用情况，低优先级作业CPU持续被压制。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002563244442.png "点击放大")
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002593844221.png "点击放大")
   besteffort目录的cpu.max计算更新：
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002563084982.png "点击放大")
   
   
 
