低优先级工作负载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代替。
配置示例
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“节点管理”,在需要开启动态资源超卖的节点池中,单击“更多 > 混部配置”。
确认“节点池混部开关”及“资源超卖”开关已打开,详情请参见云原生混部配置。

- 开启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%。

- 查看节点cgroup路径下besteffort文件更新情况,更新成功 (计算的值约为节点allocatable*cpuThrottlingThreshold% - cpuUsage):
cat "/sys/fs/cgroup/kubepods/besteffort/cpu.max"

cpu.max文件的内容通常包含两个值,格式如下:
<quota> <period>
- quota:表示容器在每个周期内可以使用的CPU时间(以微秒为单位)。
- period:表示周期的长度(以微秒为单位)。默认值通常是100000微秒(即100毫秒)。
CPU限制值可通过quota/period进行计算,如示例中154300/100000=1.543核。
验证
- 下发高优先级作业使用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" - 先对低优先级作业Pod进行CPU加压,使用以下命令观察Pod对CPU资源使用情况(需要安装Kubernetes Metrics Server插件,安装方式详见 Kubernetes Metrics Server )。
kubectl top pod

给节点加压后,可观察到cpu.max文件会刷新:
cat "/sys/fs/cgroup/kubepods/besteffort/cpu.max"

- 再对高优先级作业Pod进行CPU加压,一段时间后观察对CPU资源使用情况,低优先级作业CPU持续被压制。


besteffort目录的cpu.max计算更新:
