为什么 Serverless 能提升资源利用率?
木吴|阿里云智能高级技术专家
业务的负载往往不是一成不变的,而是随着时间呈现一定的上下波动。传统的应用构建方式一般是备足充分的资源以保障业务可用性,造成资源利用率不高的现象。随着容器技术的普及,应用可以通过弹性伸缩或者应用混部的方式来提升资源利用率,但由于资源管理的复杂度,难以在业务可用性和资源利用率上取得较好的平衡。
Serverless 平台的出现,将资源管理的责任从用户侧转移到平台侧。这种责任转移能够让用户专注在业务开发上,而平台本身利用其资源规模和负载多样性的优势,专注在资源利用率的提升上。业务使用 Serverless 平台能够大幅提升资源利用率,实现降本提效的效果。
利用率的问题
业务的负载是动态变化的,而资源的弹性往往跟不上负载变化,所以会出现资源利用率不高的情况。为了简化部署运维的复杂度,一般应用在部署时往往指定固定的实例数,此时资源和负载的变化如下图所示:

可以看到,有大量的时间存在资源的浪费,按日平均资源利用率来计算不到30%。而资源利用率直接关系到成本,如果资源利用率提升一倍,成本就能下降50%。最理想的情况是资源完全贴合负载,如下图所示:

但现实的情况是很难做到,原因有两个:
- 负载的变化可以是很快的,但是资源的创建却需要更长的时间
- 资源的弹性成功率不是100%,出于稳定性考虑需要预留资源 Buffer
因此,实际的资源状况是介于上述两种情况之间,业务开发者可以通过一些手段来提升资源利用率,使其逼近100%。接下来我们看一下一些常用的提升资源利用率的手段。
提升利用率-弹性伸缩
容器化的应用通常会使用弹性伸缩来提升资源利用率。最典型的是使用 K8s 的 HPA 策略,设置一个 CPU 利用率阈值,当容器的 CPU 利用率超过阈值时自动增加容器,低于阈值时自动减少容器。使用HPA后业务负载和资源变化情况如下:

可以看到,在新增的资源创建完成之前,已有的资源要留有一些余量以缓冲负载的上升。在上面这种阶梯形的资源变化情况下利用率是多少呢?让我们来定量地分析一下。

可以看到,需要预留的资源和负载的上升幅度以及扩容时间有关。假设在扩容时间 T 内,负载从 A 上升到 B,实际需要的资源从 xA 扩容到 xB。为了在资源创建完成之前能够接住负载,当负载为A时需要有的资源量是 xB,则资源利用率是负载增长斜率和扩容时间的一个函数。当负载的增长比例K确定时,资源利用率 Util 是一个关于扩容时间 T 的反向函数,扩容时间越短,则资源利用率越高。
例如在负载每分钟增加100%的情况下,资源利用率和扩容时间的关系。
- 当扩容时间为1分钟时,资源利用率为50%
- 当扩容时间为5分钟时,资源利用率为17%
扩容时间是提升资源利用率的关键。从负载开始上升,到新容器创建完成,整个扩容时间可以分解成如下图所示:

- 反应时间
- 指标采集时间:例如 CPU 指标的采集需要取一段时间内的 CPU 平均利用率
- 决策时间:例如 CPU 指标的采集需要连续 N 次大于阈值才会触发扩容
- 启动时间
- 系统冷启动:系统准备机器和容器环境的时间
- 应用冷启动:容器启动后应用的初始化时间,例如JVM的启动,初始化中间件,加载数据等等
如何缩短扩容时间?下面对比 K8s 和函数计算 FC 在各个阶段的优化:
| 时间 | K8s | 函数计算 FC |
|---|---|---|
| 指标采集时间 | 15s | 0 |
| 并发度根据请求实时计算 | ||
| 决策时间 | 0 | |
| K8s默认的Stabilization window为0 | 0 | |
| 并发度根据请求实时计算 | ||
| 系统冷启动 | 镜像:~30s | |
| 管控+调度+容器启动 | 代码包:200ms | |
| 镜像:3s | ||
| 容器池化、代码包/镜像加速 | ||
| 应用冷启动 | 10ms ~ 10min | 10ms ~ 10min |
函数计算 FC 通过请求级别的调度,将反应时间缩短到0;通过代码包和镜像加速,将冷启动时间优化到最低200ms。在应用冷启动时间相同的情况下,函数计算 FC 的扩容时间比 K8s 快1分钟。若应用冷启动较快(10s),则函数计算 FC 的资源利用率会大幅优于 K8s;若应用冷启动较慢(1min),则 K8s 的利用率和函数计算 FC 差距变小。如下图所示:

应用冷启动时间的优化,在函数计算 FC 场景下能够大幅提升资源利用率。但是由于应用冷启动和具体的应用逻辑相关,比较难做通用的优化。一些可能的优化方向有:
- 应用改造:将 Java 应用改造成 Nodejs/Python 等轻量的函数,将镜像改造成代码包方式,但改造代价较大。
- 函数快照:将已经初始化完成的函数实例做成镜像,通过镜像快速拉起新的实例。但镜像打破了实例的独特性,例如一些应用初始化生成的 UUID 在同一镜像拉起的实例中会冲突。
- 数据加载加速:一些应用在初始化时需要从 OSS 加载大量数据,系统可以通过 Cache/P2P 等方式加速数据的加载
总结下 HPA 存在的一些问题:
- 弹性速度问题:弹性速度慢导致 buffer 留得多,利用率低
- 缩容速度问题:缩容速度慢,有观察窗口
- CPU 阈值难以设置:靠业务经验,往往过低
提升利用率-混部超卖
容器化的应用提升资源利用率的另一种方式是混部和超卖。容器集群的使用模式有两种:
- 经典 K8s 模式:有节点池,Pod 创建在节点上,需要关注容器利用率和节点资源分配率
- Serverless K8s 模式:无节点池,Pod 由 Serverless Container 承载,只需要关注容器资源利用率

在经典 K8s 模式下,容器的弹性伸缩并没有提升资源利用率,即使将容器删除掉了,节点也还在。而节点的弹性伸缩不如容器灵活。在这种情况下,混部和超卖是提升资源利用率的常见做法。在 K8s 里面通过 resource.request < resource.limit 来实现超卖: K8s 在调度时根据 resource.request 来分配容器,但是根据 resource.limit 来限制容器的资源使用。

可以看到,一个节点上的容器的最大使用资源加起来,会超过节点的资源限制。能这样做的假设是每个容器的资源使用不会同时达到 resource.limit,否则就会产生资源竞争,导致性能下降甚至 OOM。但这样的假设并不总是成立的,每个容器的资源使用是动态变化的,这样就有一定的概率会出现资源竞争。混部超卖要达到较好的效果并不容易,影响混部效果的因素包括资源池大小,负载多样性,性能稳定性,超载迁移策略等。
首先是资源池大小,资源池越大,发生资源竞争的概率就越小。让我们来定量分析一下竞争的概率:假设有4个应用,每个应用的资源使用量有50%概率是1,50%概率是2。我们来对比将它们放在一个大的资源池和两个小的资源池的发生竞争的概率:

可以看到大资源池的概率要明显低于小资源池。最直观的,A 和 C 同时为2的时候,在小资源池模式下必然产生竞争,但是在大资源池下未必会产生竞争。对于具体的业务应用来说,由于负载规模不大,资源池也就比较小,混部产生竞争的概率就会较大。
其次是负载的多样性,负载越多样越互补,混部的效果就越好,资源利用率就越高。这种多样性既包括资源需求的多样性,例如有的负载是 CPU 密集型而有的是 IO 型的;也包括时间波动的多样性,例如有的负载是早高峰而有的是晚高峰。

对于具体的业务应用来说,负载的多样性不够,资源利用率难以进一步提高。
最后是超载迁移,当节点的负载过高时,需要将一部分容器迁移到其他的节点。这个迁移过程需要是平滑的,不影响业务。在 K8s 中调度器是不感知应用请求流量的,因此在超载迁移时,需要应用层通过健康检查、优雅上下线等机制配合进行迁移。如果没有及时迁移就会导致请求失败影响服务质量。
总结下混部存在的一些问题:
- 资源池不够大:资源竞争概率高
- 负载多样性不够:资源竞争概率高,利用率不高
- 超载迁移不平滑:节点超载时流量迁移不平滑
提升利用率 - Serverless
弹性伸缩和混部超卖是提升资源利用率的有效方式,但由于其固有的复杂度属性,业务开发者往往需要投入较大的精力才能取得较好的效果,而这些基础设施相关的工作,往往不是业务开发者的核心竞争力。业务开发者之所以需要想尽方法来提升资源利用率,最根本的问题是机器是属于业务开发者的。能否将业务开发者从机器运维中解放出来呢?Serverless 提供了一种产品形态,将资源管理的责任从用户侧转移到平台侧。这样,业务开发者只需要为业务请求付费,而无需关注资源利用率,专注在业务创新上。

Serverless 并不是没有服务器了,而是将服务器的管理、运维和利用率提升这些工作集中到平台侧,发挥平台在资源规模、负载多样性上的优势,提升机器的资源利用率。下图是Serverless系统的内部架构,通过系统侧的流量管理、弹性伸缩和混部超卖,提升集群的资源利用率:
- 通过深度垂直优化,提升冷启动速度,做到弹得快
- 通过吸收不同的业务负载,扩大资源池规模,增加负载多样性,提升混部效率

从用户侧来看,利用 Serverless 平台提供的能力来提升业务侧的资源利用率:
a. 请求调度:按请求时间计费,闲置时间不计费,实例的时间利用率为100%

b. 闲置计费:应对应用冷启动慢的业务,提供预留实例闲置计费,当实例没有请求时,费用降低到1/10

c. 动态并发度:针对 CPU 阈值设置过低的问题,系统根据实际流量动态决定最佳并发度,寻找吞吐拐点

结论
由于负载的动态变化,资源的容量评估和利用率提升,是困扰业务开发者的问题。通过弹性伸缩和混部超卖来提升资源利用率的方式由于其固有的复杂度,实施的效果并不理想。Serverless 平台将资源管理的责任从用户侧转移到平台侧,让业务开发者专注在业务开发上,而平台本身利用其资源规模和负载多样性的优势,专注在资源利用率的提升上,实现共赢。
对于业务开发者而言,根据应用的特点,可以采取如下的选型路径:
- 对于启动快的应用,直接使用按量模式,达到100%利用率
- 对于启动慢的应用,可以选择优化启动速度,也可以选择使用预留模式+闲置计费,提升利用率
- 可以立即开始使用Serverless的应用:定时任务,Web-hook

有奖体验
函数计算团队全新上线“函数计算 FC 一键部署 通义千问 预体验、文生图、图生图、图生文、文生文5大经典 AI 场景,让您获得通义千问 30次对话预体验机会,同时简单、高效实现一键部署图像生成、文字生成服务,速成 AIGC 创作家。
双重奖品设置
- 完成函数计算开通及应用部署,赢取开发者社区400积分;
- 参加 AI 生成图像比赛赢取AirPods(第三代)、阿里云定制蓝牙音箱、阿里云定制清雅杯!
参与活动链接
https://developer.aliyun.com/topic/aigc_fc#J_5808073260
为什么 Serverless 能提升资源利用率?的更多相关文章
- 作业帮上万个 CronJob 和在线业务混部,如何解决弱隔离问题并进一步提升资源利用率?
作者 吕亚霖,作业帮基础架构 - 架构研发团队负责人.负责技术中台和基础架构工作.在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO 微服务框架.DevOps 的落地实践. 别路,作 ...
- 提升资源利用率的MapReduce框架
Hadoop系统提供了MapReduce计算框架的开源实现,像Yahoo!.Facebook.淘宝.中移动.百度.腾讯等公司都在借助 Hadoop进行海量数据处理.Hadoop系统性能不仅取决于任务调 ...
- kubernetes 降本增效标准指南| 资源利用率提升工具大全
背景 公有云的发展为业务的稳定性.可拓展性.便利性带来了极大帮助.这种用租代替买.并且提供完善的技术支持和保障的服务,理应为业务带来降本增效的效果.但实际上业务上云并不意味着成本一定较少,还需适配云上 ...
- 智能 Request 推荐,K8s 资源利用率提升 252%
作者 王孝威,FinOps 认证从业者,腾讯云容器服务产品经理,热衷于为客户提供高效的 Kubernetes 使用方式,为客户极致降本增效服务. 余宇飞,FinOps 认证从业者,腾讯云专家工程师,从 ...
- kubernetes 降本增效标准指南| 容器化计算资源利用率现象剖析
作者:詹雪娇,腾讯云容器产品经理,目前主要负责腾讯云集群运维中心的产品工作. 张鹏,腾讯云容器产品工程师,拥有多年云原生项目开发落地经验.目前主要负责腾讯云TKE集群和运维中心开发工作. 引言 降本增 ...
- 成本降低40%、资源利用率提高20%的 AI 应用产品云原生容器化之路
作者 郭云龙,腾讯云高级工程师,目前就职于 CSIG 云产品三部-AI 应用产品中心,现负责中心后台业务框架开发. 导语 为了满足 AI 能力在公有云 SaaS 场景下,服务和模型需要快速迭代交付的需 ...
- 如何提升集群资源利用率? 阿里容器调度系统Sigma 深入解析
阿里妹导读:为了保证系统的在线交易服务顺利运转,最初几年,阿里都是在双11大促来临之前大量采购机器储备计算资源,导致了双11之后资源大量闲置点现象.是否能把计算任务与在线服务进行混合部署,在现有弹性资 ...
- 内存之旅——如何提升CMA利用率?
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 宋远征 李佳伟 OpenAtom OpenHarmony(以下简称"OpenHarmony") ...
- Linux下资源利用率监测利器—nmon使用
最近接了一个任务,就是测试公司服务器的资源利用率,这样对每种业务平时所占资源有了大体的了解,进而为下一步的虚拟化做准备.找了很多开源的工具,但都不理想,有的安装很复杂,需要联网(而我们的服务器很多都不 ...
- 使用 Ansible 统计服务器资源利用率
使用 Ansible 统计服务器资源利用率: 3 条 shell 脚本实现统计: CPU 利用率统计: top -bn1 | grep load | awk '{printf "CPU Lo ...
随机推荐
- IDEA提示Cannot resolve symbol 'String'
一.解决方案: 1.问题原因: 系统提示Cannot resolve symbol 'String',是由于没有正确导入JDK : 2.解决方案: 在project SDK中正确配置即可. 二.完成. ...
- java-EasyExcel模板导出
前言: 需求:根据自定义模板导出Excel,包含图片.表格,采用EasyExcel 提示:EasyExcel请使用 3.0 以上版本, 对图片操作最重要的类就是 WriteCellData<V ...
- [CF1748D] ConstructOR
题目描述 You are given three integers $ a $ , $ b $ , and $ d $ . Your task is to find any integer $ x $ ...
- SpringBoot-Validation优雅实现参数校验
1.是什么? 它简化了 Java Bean Validation 的集成.Java Bean Validation 通过 JSR 380,也称为 Bean Validation 2.0,是一种标准化的 ...
- 国产 Web 组态软件在玻璃生产线中的应用
概述 随着工厂信息化.数字化发展,智慧生产车间成为必然发展趋势,通过智能硬件.物联网.大数据等智慧化技术与手段,提高车间生产设备.工艺设备的智能执行能力,从而提升整个车间乃至工厂的智能化.网络化 ...
- Asp.net core Webapi 项目如何优雅地使用内存缓存
前言 缓存是提升程序性能必不可少的方法,Asp.net core 支持多级缓存配置,主要有客户端缓存.服务器端缓存,内存缓存和分布式缓存等.其中客户端缓和服务器端缓存在使用上都有比较大的限制,而内存缓 ...
- 【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志
目录修整 目前的系列目录(后面会根据实际情况变动): 在windows11上编译python 将python注入到其他进程并运行 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体 ...
- 万界星空科技五金家具企业MES案例介绍
五金家具行业MES解决方案 MES系统如何与家具企业生产相匹配?相较于其它大多数工业软件,MES系统无疑是受企业欢迎的软件之一.MES系统处于制造生产企业信息化的核心领域,有着承上启下的作用.那MES ...
- Harbor私有镜像仓库搭建
为什么选择Harbor 你可能会问既然我们已经有了 Docker 镜像仓库为什么还需要 Harbor 呢?嗯,Harbor 是 Docker 镜像仓库的企业级扩展,用途更广泛.这些新的企业级功能包括: ...
- Rabbitmq从安装到简单入门
1:Rabbitmq是什么? RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). 它由以高性能.健壮以及可伸缩性出名的 Erlang 写成. 2:它的优点 ...