业务的负载往往不是一成不变的,而是随着时间呈现一定的上下波动。传统的应用构建方式一般是备足充分的资源以保障业务可用性,造成资源利用率不高的现象。随着容器技术的普及,应用可以通过弹性伸缩或者应用混部的方式来提升资源利用率,但由于资源管理的复杂度,难以在业务可用性和资源利用率上取得较好的平衡。
Serverless 平台的出现,将资源管理的责任从用户侧转移到平台侧。这种责任转移能够让用户专注在业务开发上,而平台本身利用其资源规模和负载多样性的优势,专注在资源利用率的提升上。业务使用 Serverless 平台能够大幅提升资源利用率,实现降本提效的效果。
利用率的问题
业务的负载是动态变化的,而资源的弹性往往跟不上负载变化,所以会出现资源利用率不高的情况。为了简化部署运维的复杂度,一般应用在部署时往往指定固定的实例数,此时资源和负载的变化如下图所示:
可以看到,有大量的时间存在资源的浪费,按日平均资源利用率来计算不到 30%。而资源利用率直接关系到成本,如果资源利用率提升一倍,成本就能下降 50%。最理想的情况是资源完全贴合负载,如下图所示:
但现实的情况是很难做到,原因有两个:
- 负载的变化可以是很快的,但是资源的创建却需要更长的时间
- 资源的弹性成功率不是 100%,出于稳定性考虑需要预留资源 Buffer
因此,实际的资源状况是介于上述两种情况之间,业务开发者可以通过一些手段来提升资源利用率,使其逼近 100%。接下来我们看一下一些常用的提升资源利用率的手段。
提升利用率:弹性伸缩
容器化的应用通常会使用弹性伸缩来提升资源利用率。最典型的是使用 K8s 的 HPA 策略[1],设置一个 CPU 利用率阈值,当容器的 CPU 利用率超过阈值时自动增加容器,低于阈值时自动减少容器。使用 HPA 后业务负载和资源变化情况如下:
可以看到,在新增的资源创建完成之前,已有的资源要留有一些余量以缓冲负载的上升。在上面这种阶梯形的资源变化情况下利用率是多少呢?让我们来定量地分析一下。
可以看到,需要预留的资源和负载的上升幅度以及扩容时间有关。假设在扩容时间 T 内,负载从 A 上升到 B,实际需要的资源从 xA 扩容到 xB。为了在资源创建完成之前能够接住负载,当负载为 A 时需要有的资源量是 xB,则资源利用率是负载增长斜率和扩容时间的一个函数。当负载的增长比例 K 确定时,资源利用率 Util 是一个关于扩容时间 T 的反向函数,扩容时间越短,则资源利用率越高。
例如在负载每分钟增加 100% 的情况下,资源利用率和扩容时间的关系。
- 当扩容时间为 1 分钟时,资源利用率为 50%
- 当扩容时间为 5 分钟时,资源利用率为 17%
扩容时间是提升资源利用率的关键。从负载开始上升,到新容器创建完成,整个扩容时间可以分解成如下图所示: