更新时间:2024-01-27 GMT+08:00
分享

CPU Burst弹性限流

若Pod中容器设置了CPU Limit值,则该容器CPU使用将会被限制在limit值以内,形成对CPU的限流。频繁的CPU限流会影响业务性能,增大业务长尾响应时延,对于时延敏感型业务的影响尤为明显。

CPU Burst提供了一种可以短暂突破CPU Limit值的弹性限流机制,以降低业务长尾响应时间。其原理是业务在每个CPU调度周期内使用的CPU配额有剩余时,系统对这些CPU配额进行累计,在后续的调度周期内如果需要突破CPU Limit时,使用之前累计的CPU配额,以达到突破CPU Limit的效果。

  • 未开启CPU Burst时,容器可以使用的CPU配额会被限制在Limit以内,无法实现Burst。
    图1 未开启CPU Burst
  • 开启CPU Burst后,容器使用的CPU配额可以突破Limit限制,实现Burst。
    图2 开启CPU Burst

约束与限制

  • 集群版本:CCE Turbo集群且集群版本为v1.23.5-r0及以上。
  • OS版本:Huawei Cloud EulerOS 2.0。
  • 集群中需要安装Volcano 1.9.0及以上版本的插件,且开启混合部署开关(即将插件高级配置中的colocation_enable设置为true)。

操作步骤

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“节点管理”,选择“节点池”页签,创建或更新节点池时在“高级配置”中添加以下标签。

    • volcano.sh/oversubscription=true
    • volcano.sh/colocation=true
    图3 节点标签设置

  3. 在左侧导航栏中选择“插件中心”,单击Volcano插件下的“安装”,并在“参数配置”中开启“在离线业务混部”。具体安装步骤请参见Volcano调度器

    如已安装Volcano插件,可单击“编辑”查看或修改配置。

    图4 开启在离线业务混部

    CPU Burst开关由打开到关闭时,已经设置CPU Burst的存量Pod不会关闭CPU Burst功能,关闭CPU Burst仅针对新建的Pod生效。

  4. 确认开启CPU Burst。

    确认Volcano插件处于正常运行状态后,可执行以下命令,编辑kube-system命名空间下名称为volcano-agent-configuration的configmap参数,将enable参数设置为true表示开启CPU Burst,为false则表示关闭CPU Burst。
    kubectl edit configmap -nkube-system volcano-agent-configuration

    示例如下:

    ...
    data:
      colocation-config: |
        {
            "globalConfig":{
                "cpuBurstConfig":{
                    "enable":true
                },
    ...

    CPU Burst开关由打开到关闭时,已经设置CPU Burst的存量Pod不会关闭CPU Burst功能,关闭CPU Burst仅针对新建的Pod生效。

  5. 在已打开混合部署的节点池中部署工作负载。以nginx为例,设置CPU Request为2,Limit为4,并为工作负载创建集群内访问的Service。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
          annotations: 
            volcano.sh/enable-quota-burst: "true"
            volcano.sh/quota-burst-time: "200000"
        spec:
          containers:
          - name: container-1
            image: nginx:latest
            resources:
              limits:
                cpu: "4"
              requests:
                cpu: "2"
          imagePullSecrets:
            - name: default-secret
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
      labels:
        app: nginx
    spec:
      selector:
        app: nginx
      ports:
        - name: cce-service-0
          targetPort: 80
          nodePort: 0
          port: 80
          protocol: TCP
      type: ClusterIP

    注解

    是否必选

    描述

    volcano.sh/enable-quota-burst

    为工作负载开启CPU Burst。

    volcano.sh/quota-burst-time

    为保障CPU调度稳定性以及降低多个容器同时发生CPU Burst时的争用,默认设置的CPU Burst值与CPU Quota值相等,即容器最多可以使用两倍的CPU Limit值,默认为Pod内所有业务容器设置CPU Burst。

    例如容器的CPU Limit值为4时,CPU Burst默认值为400000(此处1核=100000),表示达到Limit值后最多可以额外使用4核CPU。

  6. 验证CPU Burst。

    您可以使用wrk工具对工作负载进行加压,观察开启和关闭CPU Burst时业务的时延、限流情况、突破CPU limit的情况。

    1. 使用以下命令为Pod加压,其中<service_ip>为Pod关联的Service IP。
      # 您需要在节点上下载并安装wrk工具
      # 在Apache配置中开启了Gzip压缩模块, 用于模拟服务端处理请求的计算逻辑。
      # 执行加压命令, 需注意修改目标应用的IP地址。
      wrk -H "Accept-Encoding: deflate, gzip" -t 4 -c 28 -d 120  --latency --timeout 2s http://<service_ip>
    2. 获取Pod ID。
      kubectl get pod -n <namespace> <pod_name> -o jsonpath='{.metadata.uid}'
    3. 限流情况和突破CPU limit的情况可以在节点上通过以下命令查看,其中<pod_id>为Pod的ID。
      cat /sys/fs/cgroup/cpu/kubepods/burstable/pod<pod_id>/cpu.stat
      回显示例如下:
      nr_periods 0  #经过多少个调度周期
      nr_throttled 0  #容器被限流的次数
      throttled_time 0  #容器总的被限流的时间(纳秒)
      nr_bursts 0 #容器突破CPU limit的次数
      burst_time 0 #容器总共burst的时间
      表1 本例中结果汇总

      是否开启CPU Burst

      p99时延

      nr_throttled

      限流次数

      throttled_time

      总限流时间

      nr_bursts

      突破limit值次数

      bursts_time

      总突破limit时间

      未开启CPU Burst

      2.96ms

      986

      14.3s

      0

      0

      开启CPU Burst

      456us

      0

      0

      469

      3.7s

分享:

    相关文档

    相关产品