文档首页/ 云容器引擎 CCE/ 用户指南/ 调度/ 云原生混部/ 低优先级工作负载CPU限流
更新时间:2026-05-21 GMT+08:00
分享

低优先级工作负载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控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“节点管理”,在需要开启动态资源超卖的节点池中,单击“更多 > 混部配置”

    确认“节点池混部开关”“资源超卖”开关已打开,详情请参见云原生混部配置

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

  4. 查看节点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核。

验证

  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 )。

    kubectl top pod

    给节点加压后,可观察到cpu.max文件会刷新:

    cat "/sys/fs/cgroup/kubepods/besteffort/cpu.max"

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

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

相关文档