# 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   
  ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001713893877.png "点击放大") 
- 开启CPU Burst后，容器使用的CPU配额可以突破Limit限制，实现Burst。
  图2开启CPU Burst   
  ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001665854138.png "点击放大") 
#### 约束与限制
- 集群版本：CCE Turbo集群且集群版本为v1.23.5-r0及以上。
- OS版本：Huawei Cloud EulerOS 2.0。
- 集群中需要安装Volcano 1.9.0及以上版本的插件，且开启混合部署开关。
 
#### 操作步骤
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"节点管理"，在需要开启CPU Burst弹性限流的节点池中，单击"更多 \> 混部配置"。 
   确认"节点池混部开关"及"CPU Burst 弹性限流"开关已打开，详情请参见[云原生混部配置](https://support.huaweicloud.com/usermanual-cce/cce_10_0708.html#cce_10_0708__section19689248184019)。
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   已有的混部策略中，当CPU Burst开关由打开到关闭时，已经设置CPU Burst的存量Pod不会关闭CPU Burst功能，关闭CPU Burst仅针对新建的Pod生效。
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001925317274.png "点击放大")
   
   
3. 在已打开混合部署的节点池中部署工作负载。以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。 |
      
   
   
4. 验证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                                                  |
         
      
   
   
   
   
 
