为什么 Serverless 能提升资源利用率?

news2024/12/22 18:33:25

作者:木吴 阿里云智能高级技术专家

业务的负载往往不是一成不变的,而是随着时间呈现一定的上下波动。传统的应用构建方式一般是备足充分的资源以保障业务可用性,造成资源利用率不高的现象。随着容器技术的普及,应用可以通过弹性伸缩或者应用混部的方式来提升资源利用率,但由于资源管理的复杂度,难以在业务可用性和资源利用率上取得较好的平衡。

Serverless 平台的出现,将资源管理的责任从用户侧转移到平台侧。这种责任转移能够让用户专注在业务开发上,而平台本身利用其资源规模和负载多样性的优势,专注在资源利用率的提升上。 业务使用 Serverless 平台能够大幅提升资源利用率,实现降本提效的效果。

利用率的问题

业务的负载是动态变化的,而资源的弹性往往跟不上负载变化,所以会出现资源利用率不高的情况。为了简化部署运维的复杂度,一般应用在部署时往往指定固定的实例数,此时资源和负载的变化如下图所示:

在这里插入图片描述

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

在这里插入图片描述

但现实的情况是很难做到,原因有两个:

  1. 负载的变化可以是很快的,但是资源的创建却需要更长的时间
  2. 资源的弹性成功率不是 100%,出于稳定性考虑需要预留资源 Buffer

因此,实际的资源状况是介于上述两种情况之间,业务开发者可以通过一些手段来提升资源利用率,使其逼近 100%。接下来我们看一下一些常用的提升资源利用率的手段。

提升利用率:弹性伸缩

容器化的应用通常会使用弹性伸缩来提升资源利用率。最典型的是使用 K8s 的 HPA 策略 [ 1] ,设置一个 CPU 利用率阈值,当容器的 CPU 利用率超过阈值时自动增加容器,低于阈值时自动减少容器。使用 HPA 后业务负载和资源变化情况如下:

在这里插入图片描述

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

在这里插入图片描述

可以看到,需要预留的资源和负载的上升幅度以及扩容时间有关。假设在扩容时间 T 内,负载从 A 上升到 B,实际需要的资源从 xA 扩容到 xB。为了在资源创建完成之前能够接住负载,当负载为 A 时需要有的资源量是 xB,则资源利用率是负载增长斜率和扩容时间的一个函数。当负载的增长比例 K 确定时,资源利用率 Util 是一个关于扩容时间 T 的反向函数,扩容时间越短,则资源利用率越高。

例如在负载每分钟增加 100% 的情况下,资源利用率和扩容时间的关系。

  • 当扩容时间为 1 分钟时,资源利用率为 50%
  • 当扩容时间为 5 分钟时,资源利用率为 17%

扩容时间是提升资源利用率的关键。从负载开始上升,到新容器创建完成,整个扩容时间可以分解成如下图所示:

在这里插入图片描述

  1. 反应时间
    1. 指标采集时间:例如 CPU 指标的采集需要取一段时间内的 CPU 平均利用率
    2. 决策时间:例如 CPU 指标的采集需要连续 N 次大于阈值才会触发扩容
  1. 启动时间
    1. 系统冷启动:系统准备机器和容器环境的时间
    2. 应用冷启动:容器启动后应用的初始化时间,例如 JVM 的启动,初始化中间件,加载数据等等

如何缩短扩容时间?下面对比 K8s 和函数计算 FC [ 2] 在各个阶段的优化:

时间K8s函数计算 FC
指标采集时间15s0并发度根据请求实时计算
决策时间0K8s 默认的 Stabilization window [ 3] 为 00并发度根据请求实时计算
系统冷启动镜像:~30s管控+调度+容器启动代码包:200ms镜像:3s容器池化、代码包/镜像加速
应用冷启动10ms ~ 10min10ms ~ 10min

函数计算 FC 通过请求级别的调度,将反应时间缩短到 0;通过代码包和镜像加速,将冷启动时间优化到最低 200ms。在应用冷启动时间相同的情况下,函数计算 FC 的扩容时间比 K8s 快 1 分钟。若应用冷启动较快(10s),则函数计算 FC 的资源利用率会大幅优于 K8s;若应用冷启动较慢(1min),则 K8s 的利用率和函数计算 FC 差距变小。如下图所示:

在这里插入图片描述

应用冷启动时间的优化,在函数计算 FC 场景下能够大幅提升资源利用率。但是由于应用冷启动和具体的应用逻辑相关,比较难做通用的优化。一些可能的优化方向有:

  1. 应用改造:将 Java 应用改造成 Nodejs/Python 等轻量的函数,将镜像改造成代码包方式,但改造代价较大。
  2. 函数快照:将已经初始化完成的函数实例做成镜像,通过镜像快速拉起新的实例。但镜像打破了实例的独特性,例如一些应用初始化生成的 UUID 在同一镜像拉起的实例中会冲突。
  3. 数据加载加速:一些应用在初始化时需要从 OSS 加载大量数据,系统可以通过 Cache/P2P 等方式加速数据的加载

总结下 HPA 存在的一些问题:

  1. 弹性速度问题:弹性速度慢导致 buffer 留得多,利用率低
  2. 缩容速度问题:缩容速度慢,有观察窗口
  3. CPU 阈值难以设置:靠业务经验,往往过低

提升利用率:混部超卖

容器化的应用提升资源利用率的另一种方式是混部和超卖。容器集群的使用模式有两种:

  1. 经典 K8s 模式:有节点池,Pod 创建在节点上,需要关注容器利用率和节点资源分配率
  2. Serverless K8s 模式:无节点池,Pod 由 Serverless Container 承载,只需要关注容器资源利用率

在这里插入图片描述

在经典 K8s 模式下,容器的弹性伸缩并没有提升资源利用率,即使将容器删除掉了,节点也还在。而节点的弹性伸缩不如容器灵活。在这种情况下,混部和超卖是提升资源利用率的常见做法。

在 K8s 里面通过 resource.request [ 4] < resource.limit 来实现超卖:K8s 在调度时根据 resource.request 来分配容器,但是根据 resource.limit 来限制容器的资源使用。

在这里插入图片描述

可以看到,一个节点上的容器的最大使用资源加起来,会超过节点的资源限制。能这样做的假设是每个容器的资源使用不会同时达到 resource.limit,否则就会产生资源竞争,导致性能下降甚至 OOM。但这样的假设并不总是成立的,每个容器的资源使用是动态变化的,这样就有一定的概率会出现资源竞争。混部超卖要达到较好的效果并不容易,影响混部效果的因素包括资源池大小,负载多样性,性能稳定性,超载迁移策略等。

首先是资源池大小,资源池越大,发生资源竞争的概率就越小。让我们来定量分析一下竞争的概率:假设有 4 个应用,每个应用的资源使用量有 50% 概率是 1,50% 概率是 2。我们来对比将它们放在一个大的资源池和两个小的资源池的发生竞争的概率:

在这里插入图片描述

可以看到大资源池的概率要明显低于小资源池。最直观的,A和C同时为2的时候,在小资源池模式下必然产生竞争,但是在大资源池下未必会产生竞争。对于具体的业务应用来说,由于负载规模不大,资源池也就比较小,混部产生竞争的概率就会较大。

其次是负载的多样性,负载越多样越互补,混部的效果就越好,资源利用率就越高。这种多样性既包括资源需求的多样性,例如有的负载是 CPU 密集型而有的是 IO 型的;也包括时间波动的多样性,例如有的负载是早高峰而有的是晚高峰。

在这里插入图片描述

对于具体的业务应用来说,负载的多样性不够,资源利用率难以进一步提高。

最后是超载迁移,当节点的负载过高时,需要将一部分容器迁移到其他的节点。这个迁移过程需要是平滑的,不影响业务。在 K8s 中调度器是不感知应用请求流量的,因此在超载迁移时,需要应用层通过健康检查、优雅上下线等机制配合进行迁移。如果没有及时迁移就会导致请求失败影响服务质量。

总结下混部存在的一些问题:

  1. 资源池不够大:资源竞争概率高
  2. 负载多样性不够:资源竞争概率高,利用率不高
  3. 超载迁移不平滑:节点超载时流量迁移不平滑

提升利用率:Serverless

弹性伸缩和混部超卖是提升资源利用率的有效方式,但由于其固有的复杂度属性,业务开发者往往需要投入较大的精力才能取得较好的效果,而这些基础设施相关的工作,往往不是业务开发者的核心竞争力。业务开发者之所以需要想尽方法来提升资源利用率,最根本的问题是机器是属于业务开发者的。能否将业务开发者从机器运维中解放出来呢?Serverless 提供了一种产品形态,将资源管理的责任从用户侧转移到平台侧。这样,业务开发者只需要为业务请求付费,而无需关注资源利用率,专注在业务创新上。

在这里插入图片描述

Serverless 并不是没有服务器了,而是将服务器的管理、运维和利用率提升这些工作集中到平台侧,发挥平台在资源规模、负载多样性上的优势,提升机器的资源利用率。 下图是 Serverless 系统的内部架构,通过系统侧的流量管理、弹性伸缩和混部超卖,提升集群的资源利用率:

  1. 通过深度垂直优化,提升冷启动速度,做到弹得快
  2. 通过吸收不同的业务负载,扩大资源池规模,增加负载多样性,提升混部效率

在这里插入图片描述

从用户侧来看,利用 Serverless 平台提供的能力来提升业务侧的资源利用率:

a. 请求调度 [ 5] :按请求时间计费,闲置时间不计费,实例的时间利用率为 100%

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

结论

由于负载的动态变化,资源的容量评估和利用率提升,是困扰业务开发者的问题。通过弹性伸缩和混部超卖来提升资源利用率的方式由于其固有的复杂度,实施的效果并不理想。Serverless 平台将资源管理的责任从用户侧转移到平台侧,让业务开发者专注在业务开发上,而平台本身利用其资源规模和负载多样性的优势,专注在资源利用率的提升上,实现共赢。

对于业务开发者而言,根据应用的特点,可以采取如下的选型路径:

  1. 对于启动快的应用,直接使用按量模式,达到 100% 利用率
  2. 对于启动慢的应用,可以选择优化启动速度,也可以选择使用预留模式+闲置计费,提升利用率
  3. 可以立即开始使用 Serverless 的应用:定时任务,Web-hook

在这里插入图片描述

有奖体验

阿里云将提供免费函数计算 FC 产品资源,邀请你体验【通义千问】一键部署通义千问预体验,本实验基于函数计算,让您一键在阿里云上部署自己的对话机器人,快来打造自己的 AI 小助理吧!

双重奖品设置:

完成函数计算开通及应用部署,赢取开发者社区400积分;

参加 AI 生成图像比赛赢取 AirPods(第三代)、阿里云定制蓝牙音箱、阿里云定制清雅杯!

相关链接:

[1] HPA 策略

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

[2] 函数计算 FC

https://www.aliyun.com/product/fc

[3] Stabilization window

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#default-behavior

[4] resource.request

https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

[5] 请求调度

https://help.aliyun.com/document_detail/179379.htm?spm=a2c4g.54301.0.0.474b5feezaRWiK#p-kwb-hz6-6e3

[6] 闲置计费

https://help.aliyun.com/document_detail/185038.htm?spm=a2c4g.54301.0.0.1fc515f93M64Wd#section-sw6-nzj-rbs

点击此处体验基于函数计算 FC 部署【通义千问】预体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树相关OJ练习题(1、锯齿形层序遍历 2、二叉搜索子树的最大键值和 3、验证二叉树 4、剑指 Offer II 047. 二叉树剪枝)

接上次博客&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/130934670​​​​​​ 目录 1、锯齿形层序遍历 2、二叉搜索子树的最大键值和 3、验证二叉树 4、剑指 Offer II 047. 二叉树剪枝 最近临近期末&#xff0c;忙得焦头烂额的…… 天天都是高数、微观经济…

疫情下基于Java的居民购菜平台设计+第六稿+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 疫情下基于Java的居民购菜平台设计第六稿文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 疫情下基于Java的居民购菜平台设计 …

uniapp设置滚动条滚动到指定位置

场景&#xff1a;左侧菜单栏&#xff0c;每次切换时&#xff0c;需要右侧商品展示区保持滚动条及页面在最顶部 1.利用scroll-view 中scroll-top属性实现 1.1设置scrollToTop属性为0 data() {return {// 保证每次切换&#xff0c;滚动条位置都在最顶部scrollToTop: 0,}; } 1.…

实验篇(7.2) 13. 站对站安全隧道 - 仅一方发起连接(FortiGate-IPsec) ❀ 远程访问

【简介】上一篇实验发现&#xff0c;两端都是可以远程的公网IP的话&#xff0c;两端防火墙都可以发出连接请求&#xff0c;并且都能够连通。这样的好处是安全隧道不用随时在线&#xff0c;只在有需求时才由发起方进行连接。但是现实中很多情况下只有一端公网IP可以远程&#xf…

C++语言与C的不同之处

头文件 C语言的引用头文件的方式是include名字.h的方式进行引用&#xff0c;而C去掉了.h&#xff0c;但是又是完全兼容C语言的。在库前面添加一个c来表明这个库是来自于C语言的。 //C语言的方法&#xff1a;带.h的方式进行include #include<stdio.h> #include<math.…

Python实现PSO粒子群优化支持向量机分类模型(svc算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

DevChat 上线 VSCode 插件!国内开源的 AI 编程,做不被 AI 取代的新程序员!

打不过就加入。与其担心被 AI 取代&#xff0c;不如现在就学习驾驭它。 &#xff08;要用 AI 来辅助写代码&#xff0c;国际主流的几个大语言模型的表现都不尽如人意&#xff0c;谁用谁知道……除了 Claude 我们还在测试中。于是&#xff0c;我们基于大语言模型&#xff0c;做…

数据指北 AI

大家好&#xff0c;我是脚丫先生 (o^^o) &#x1f604; &#x1f600; 与GPT-AI聊天是一件很有趣的事情&#xff01; 最近一直没更新&#xff0c;在忙于研究搭建GPT~~~搭建了一个可以二开的数据指北AI。 目前模型是用的GPT3&#xff0c;有点不精准。 鲁迅和周树人的关系都搞…

阿里云数据库PolarDB MySQL版倚天ARM架构详解

阿里云云原生数据库PolarDB MySQL版推出倚天ARM架构&#xff0c;倚天ARM架构规格相比X86架构规格最高降价45%&#xff0c;PolarDB针对自研倚天芯片&#xff0c;从芯片到数据库内核全链路优化&#xff0c;助力企业降本增效。基于阿里云自研的倚天服务器&#xff0c;同时在数据库…

html2canvas给指定区域添加满屏水印

效果图如下&#xff1a; 直接贴上代码 下载插件&#xff1a; npm i html2canvas <template><div ref"imageDom"><el-button click"downloadPicture">下载</el-button><div><el-tableclass"tableX":height&q…

JUC并发编程:Condition的简单理解与使用

目录 1&#xff1a;概述 2&#xff1a;举例 3&#xff1a;condition 的一些方法 1&#xff1a;概述 Condition本质上是一个接口&#xff0c;Condition因素与Object监视器方法&#xff08; wait &#xff0c; notify和notifyAll &#xff09;成不同的对象&#xff0c;以得到具…

医院信息化PACS系统源码(影像阅片、报告模板、三维重建)

随着互联网强势走进医院行业&#xff0c;医院信息化建设已成为推动医院机构正常运转和进行现代化管理的基本要素。影像检查作为医院机构在疾病诊断中的高频诊疗项目&#xff0c;业务量自然不容小觑&#xff0c;为减轻医生工作压力&#xff0c;PACS系统成为机构“必选项”。 一、…

sheetJS实现把excel导入数据库

1、问题描述 最近在做报表导入数据库的需求&#xff0c;报表文件为excel里面有多个sheet。 2、解决方法 使用FileReader异步读取上传的文件。使用sheet.js进行excel表格内容的解析。使用bootstrap.js的tab组件对上传的表格进行一个页面预览的展示。 3、参考代码 ImportReportF…

Linux 文件实时备份 rsync+lsyncd

一、原理和说明 lsyncd官网 &#xff08;一&#xff09;软件说明 目的是每次只把新修改的同步&#xff0c;而不是全量备份。 Rsync&#xff08;同步&#xff09;&#xff1a;将一个服务器的一个文件夹的内容提交到另外一个服务器的文件夹 lsyncd&#xff08;差异检测并调用r…

Java阶段四Day06

Java阶段四Day06 文章目录 Java阶段四Day06关于配置响应内容中不包含Null的属性关于配置跨域关于如何不用添加RequestBody也可以接收请求 关于配置响应内容中不包含Null的属性 响应内容中的null可以使用以下三种方式中的一种即可解决&#xff0c;且范围越小&#xff0c;越优先 …

新人如何在实际工作做性能测试?怎么合理选择并发数?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 从小入手&#xf…

C++ 11(3) | 新的类功能、可变参数模板、lambda表达式

前文中我们讲述了C11中新增的右值引用&#xff0c;在本文中我们将继续讲解C11中的新的类功能、可变参数模板、lambda表达式。 新的类功能 默认成员函数 之前我们学习过在C中有六个默认成员函数构造函数、析构函数、拷贝构造函数、拷贝赋值重载、取地址重载、const 取地址重载…

【59天|503.下一个更大元素II ● 42. 接雨水】

503.下一个更大元素II class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;int n nums.size();vector<int> res (n, -1);for(int i0; i<2*n;i){while(!st.empty()&&nums[i%n]>nums[st.t…

第13章_事务基础知识

第13章_事务基础知识 1.数据库事务概述 事务是数据库区别于文件系统的重要特性之一&#xff0c;当我们有了事务就会让数据库始终保持一致性&#xff0c;同时我们还能通过事务的机制恢复到某个时间点&#xff0c;这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。 1…

Moonbeam路由流动性

Moonbeam路由流动性&#xff08;Moonbeam Routed Liquidity, MRL&#xff09;使加密资产流动性能够从其他生态系统&#xff08;如以太坊、Solana、Polygon或Avalanche&#xff09;进入波卡生态系统。借助MRL&#xff0c;用户可以通过简洁的用户体验向/从波卡转移他们的流动性。…