CPU Burst策略是ACK提供的差异化SLO能力之一,目的是提升延迟敏感型应用的容器性能表现。受CPU Limit约束,容器在微观层面会频繁遭遇内核资源分配的限流,进而导致应用服务受损。ack-slo-manager通过对CPU Throttled的动态感知,以及容器参数的自适应调节,可以有效提升延迟敏感型应用的服务质量。本文介绍CPU Burst策略的原理、使用方式以及效果分析。
前提条件
- 此功能仅适用于ACK Pro版集群,使用前请先创建该集群。具体操作,请参见创建ACK Pro版集群。
- 已安装ack-slo-manager。具体操作,请参见使用说明。
使用限制
系统组件版本要求具体如下表所示。
组件 | 版本要求 |
---|---|
Kubernetes | ≥v1.18 |
ack-slo-manager | ≥0.2.0 |
Helm版本 | ≥v3.0 |
内核和操作系统 | Alibaba Cloud Linux 2、CentOS 7.6、CentOS 7.7 |
原理说明
K8s为容器资源管理提供了Limit(约束)的语义描述,对于CPU这类分时复用型的资源,当容器指定了CPU Limit,操作系统会按照一定的时间周期约束资源使用。例如对于CPU Limit = 2的容器,操作系统内核会限制容器在每100 ms周期内最多使用200 ms的CPU时间片。
CPU使用率是衡量容器运行状态的关键指标,管理员通常会参考该指标来设置容器CPU Limit。相较于常用的秒级别指标,百毫秒级别下容器的CPU使用率往往呈现更为明显的毛刺特征。若容器在100 ms内将CPU Limit消耗完成,线程会因限流(CPU Throttled)而被操作系统挂起,如下图所示。

下图展示了一台4核节点、某CPU Limit = 2的Web服务类容器,在收到请求(req)后各线程(Thread)的CPU资源分配情况。可以看出,即使容器在最近1s内整体的CPU使用率较低,受CPU Throttled机制的影响,Thread 2仍需要等待下一个周期才能继续将req 2处理完成,进而导致请求的响应时延(RT)变大,这通常就是容器RT长尾现象严重的原因之一。

Alibaba Cloud Linux 2在内核版本4.19.91-22.al7中提供了CPU Burst功能,允许容器在空闲时积累一些CPU时间片,用于满足突发时的资源需求,进而可以提升容器性能、降低延迟指标。

对于尚未支持CPU Burst策略的内核版本,ack-slo-manager会通过类似的原理,监测容器CPU Throttled状态,并动态调节容器的CPU Limit,实现与内核CPU Burst策略类似的效果。
cfs quota
,并不会真正修改Pod Spec的CPU Limit字段。
上述自动调节CFS quota的策略,还可用于满足容器CPU资源需求突增的场景。例如当业务流量突然上涨,ack-slo-manager可以在保障整机负载水位安全的前提下,秒级别内快速解决CPU的资源瓶颈。
Alibaba Cloud Linux提供的内核级CPU Burst策略有着更高的灵敏度,我们强烈建议您为延迟敏感型应用(Latency Sensitve)开启该特性。关于CPU Burst的更多介绍,请参见阿里云在KubeCon 2021的演讲CPU Burst:摆脱不必要的节流,同时实现高CPU使用率和高应用程序性能。
使用方式
- 通过Pod Annotation开启CPU Burst
添加以下Annotation,为Pod单独开启CPU Burst策略。
annotations: #设置为auto, 表示开启该Pod的cpu burst功能。 alibabacloud.com/cpuBurst: '{"policy": "auto"}' #设置为none, 表示关闭该Pod的cpu burst功能。 #alibabacloud.com/cpuBurst: '{"policy": "none"}'
- 通过ConfigMap全局开启CPU Burst
使用以下ConfigMap示例,默认开启全集群的CPU Burst策略。
apiVersion: v1 data: cpu-burst-config: '{"clusterStrategy": {"policy": "auto"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "cpuBurstOnly"}}' #cpu-burst-config: '{"clusterStrategy": {"policy": "none"}}' kind: ConfigMap metadata: name: ack-slo-manager-config namespace: kube-system
为避免干扰ConfigMap中其他配置项,建议使用PATCH方式进行更新,命令如下所示。kubectl patch cm -n kube-system ack-slo-manager-config --patch "$(cat configmap.yaml)"
- 指定Namespace开启部分容器的CPU Burst
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-pod-config namespace: kube-system data: #单独开启或关闭部分Namespace的Pod。 cpu-burst: | { "enabledNamespaces": ["white-ns"], "disabledNamespaces": ["black-ns"] }
- 高级配置参数Pod级别Annotation可扩展字段,以及ConfigMap详细配置示例如下。
# ConfigMap ack-slo-manager-config样例。 data: cpu-burst-config: | { "clusterStrategy": { "policy": "auto", "cpuBurstPercent": 1000, "cfsQuotaBurstPercent": 300, "sharePoolThresholdPercent": 50, "cfsQuotaBurstPeriodSeconds": -1 } } # Pod Annotation样例。 alibabacloud.com/cpuBurst: '{"policy": "auto", "cpuBurstPercent": 1000, "cfsQuotaBurstPercent": 300, "cfsQuotaBurstPeriodSeconds": -1}'
以下为CPU Burst策略的相关高级参数,如果您有特殊需求,请提交工单。
参数 类型 说明 policy string - (默认值)none:关闭CPU Busrt策略,相关参数会被恢复为创建初始值。
- cpuBurstOnly:仅开启Alibaba Cloud Linux 2内核的CPU Burst特性。
- cfsQuotaBurstOnly:仅开启通用版本下CFS quota的自动弹性能力。
- auto:自动开启所有CPU Burst能力,包括Ali Linux内核特性,以及通用版本下CFS quota的自动弹性能力。
cpuBurstPercent int 默认值为 1000
,单位为百分比。对应Alibaba Cloud Linux 2内核CPUBurst策略,表示相较于CPU Limit,CPU Burst放大的百分比。例如
CPU Limit = 1
,按默认配置CPU Burst为10倍。更多信息,请参见在cgroup v1接口开启CPU Burst功能。cfsQuotaBurstPercent int 默认值为
300
,单位为百分比。通用内核版本的CPU Limit弹性能力,容器cgroup参数(cfs_quota)可上调的最大比例,默认为3倍。
cfsQuotaBurstPeriodSeconds int 默认值为
-1
,表示不限制,单位为秒。通用内核版本的CPU Limit弹性能力,容器可以按上限(
cfsQuotaBurstPercent
)持续消耗CPU的时间限制。sharePoolThresholdPercent int 默认值为
50
,单位为百分比。通用内核版本下的CPU Limit弹性策略,节点CPU使用率的安全水位阈值,超出阈值后,已经上调的容器的cgroup参数(
cfs_quota
)会被恢复。注意- 当您开启CFS quota的自动调整时(
policy
设置为cfsQuotaBurstOnly
或auto
),容器CPU Limit在节点上对应的参数(cfs quota
)会随CPU Throttled情况动态调整。 - 在对容器进行压测时,建议您同时保持对容器CPU用量的观察,或者临时关闭CFS quota的自动调整(
policy
设置为cpuBurstOnly
或none
),以便在生产环境保持更好的资源弹性。
验证CPU Burst效果
结果分析
- 全部关闭表示CPU Burst策略为
none
。 - 全部开启表示CPU Burst策略为
auto
。
Alibaba Cloud Linux 2 | 全部关闭 | 全部开启 |
---|---|---|
apache RT-p99 | 107.37 ms | 67.18 ms(-37.4%) |
CPU Throttled Ratio | 33.3% | 0% |
Pod CPU平均利用率 | 31.8% | 32.6% |
CentOS 7 | 全部关闭 | 全部开启 |
---|---|---|
apache RT-p99 | 111.69 ms | 71.30 ms (-36.2%) |
CPU Throttled Ratio | 33% | 0% |
Pod CPU平均利用率 | 32.5% | 33.8% |
由以上对比数据可得:
- 在开启CPU Burst能力后,应用的RT指标的p99分位值得到了明显的优化。
- 对比CPU Throttled及利用率指标,可以看到开启CPU Burst能力后,CPU Throttled情况得到了消除,同时Pod整体利用率基本保持不变。