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及以上版本的插件,且开启混合部署开关。
操作步骤
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“节点管理”,在需要开启CPU Burst弹性限流的节点池中,单击“更多 > 混部配置”。
确认“节点池混部开关”及“CPU Burst 弹性限流”开关已打开,详情请参见云原生混部配置。
已有的混部策略中,当CPU Burst开关由打开到关闭时,已经设置CPU Burst的存量Pod不会关闭CPU Burst功能,关闭CPU Burst仅针对新建的Pod生效。
- 在已打开混合部署的节点池中部署工作负载。以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。
- 验证CPU Burst。
您可以使用wrk工具对工作负载进行加压,观察开启和关闭CPU Burst时业务的时延、限流情况、突破CPU limit的情况。
- 使用以下命令为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>
- 获取Pod ID。
kubectl get pod -n <namespace> <pod_name> -o jsonpath='{.metadata.uid}'
- 限流情况和突破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
- 使用以下命令为Pod加压,其中<service_ip>为Pod关联的Service IP。