Serverless冷启动:如何让函数计算更快更强?
摘要:借助Serverless计算,开发者仅需上传业务代码并进行简单的资源配置便可实现服务的快速构建部署,云服务商则按照函数服务调用量和实际资源使用收费,从而帮助用户实现业务的快速交付和低成本运行。
本文分享自华为云社区《Serverless冷启动:如何让函数计算更快更强?》,作者:DevAI 。
问题背景
Serverless计算也称服务器无感知计算或函数计算,是近年来一种新兴的云计算编程模式。其致力于大幅简化云业务开发流程,使得应用开发者从繁杂的服务器运维工作中解放出来(例如自动伸缩、日志和监控等)。借助Serverless计算,开发者仅需上传业务代码并进行简单的资源配置便可实现服务的快速构建部署,云服务商则按照函数服务调用量和实际资源使用收费,从而帮助用户实现业务的快速交付 (fast built & Relia. Deliv.)和低成本运行。
然而,Serverless计算的无状态函数编程在带来高度弹性和灵活性的同时,也导致了不可避免的冷启动问题。由于函数通常在执行完请求后被释放,当请求到达时,如果没有可用实例则需要从零开始启动新的实例处理请求(即冷启动)。当冷启动发生时,Serverless平台需要执行实例调度、镜像分发、实例创建、资源配置、运行环境初始化以及代码加载等一系列操作,这一过程引发的时延通常可达请求实际执行时间的数倍。相对于冷启动调用,热调用(即请求到达时有可用实例)的准备时间可以控制在亚毫秒级。在特定领域例如AI推理场景,冷启动调用导致的高时延问题则更为突出,例如,使用TensorFlow框架的启动以及读取和加载模型可能需要消耗数秒或数十秒。
因此,如何缓解Serverless函数的冷启动问题,改善函数性能是当前Serverless领域面临的主要挑战之一。
解决方案
从研究思路上看,目前工业界和学术界主要从两个方面入手解决冷启动问题:
(1)加快实例启动速度:当冷启动调用发生时,通过加速实例的初始化过程来减少启动时延;
当冷启动发生时,Serverless平台内部实例的初始化过程可以划分为准备和加载两个阶段。其中,准备阶段主要包括控制面决策调度/镜像获取、Runtime运行时初始化、应用数据/代码传输几个部分。而加载阶段位于实例内部,包括用户应用框架和代码的初始化过程。在工业界和学术界公开的研究成果中,针对实例启动过程中的每个阶段都有大量的技术手段和优化方法。如下图所示,经过优化,实例冷启动的准备阶段和加载阶段时间可被极大得缩短。
下面列举了一些近年来发表在计算机系统领域知名会议的相关工作,主要可以分为五个方面:
- 调度优化/镜像快速分发/本地池化:例如基于树结构的跨节点快速镜像分发 FaasNet [ATC'21];Pod池+特化实例跳过镜像传输 [华为FunctionGraph]。其中,快速镜像分发依赖于VM节点的上/下行网络带宽,Pod池特化技术则是典型的以空间换时间的做法。
- 轻量级虚拟化/安全容器:例如针对传统容器Docker的精简优化工作SOCK [ATC'21];更侧重安全性的轻量级虚拟化技术(Kata Containers, gVisor等);基于安全容器的进一步的精简优化工作 (Catalyzer [ASPLOS'20], REAP[ASPLOS'21])。通过裁剪优化,安全容器的启动时延最快可以被压缩至亚毫秒级。
- 数据共享/跨节点传输优化:例如基于RDMA共享内存减少跨节点启动过程的数据拷贝 RemoteFork [OSDI'23];或者利用本地代码缓存跳过代码传输 [华为FunctionGraph, 字节ByteFaaS等]。基于RDMA技术的跨节点数据传输时延可降低至微妙级。
- 用户代码精简/快速加载:例如针对Java语言的JVM(Java Virtual Machine)运行时优化技术 [FunctionGraph];以及针对Python运行时库的裁剪优化工作FaasLight [arxiv'23]。通过特定的优化,JVM启动时间可由数秒降低至数十毫秒,而Python代码的启动加载时延可降低约1/3。
- 其它非容器运行时技术:例如WASM(即WebAssembly)技术以及针对WASM的内存隔离方面的优化工作Faasm [ATC'20]。相比容器化技术,直接以进程和线程方式组织运行函数,可在保证低开销函数运行的同时具备高度灵活性。
(2)降低冷启动发生率:通过函数预热、复用或实例共享等方法提高实例的利用效率,减少冷启动调用的发生
尽管已有的一些实例启动加速方法已经可以将运行时环境的初始化时间压缩至数十毫秒甚至是数毫秒,然而用户侧的延迟却仍然存在,例如程序状态的恢复,变量或者配置文件的重新初始化,相关库和框架的启动。具体来讲,在机器学习应用中,TensorFlow框架的启动过程往往需要花费数秒,即使实例运行时环境的启动时间再短,应用整体的冷启动时延对用户而言依然是无法接受的(注:通常大于200ms的时延可被用户察觉)。在这种情况下,可以从另一个角度入手解决冷启动问题,即降低冷启动调用的发生率。例如,通过缓存完整的函数实例,请求到达时可以快速恢复并处理请求,从而实现近乎零的初始化时延(例如Docker unpause操作时延小于0.5ms)。
降低冷启动发生率的相关研究可以分为如下几个方面:
- 实例保活/实例预留:例如基于Time-to-Live的keepalive保活机制 [AWS Lambda, OpenWhisk];或者通过并发配置接口预留一定数量的实例 [AWS Labmda等];这些方法原理简单,易于实现,但是在面对负载变化时缓存效率较低。
- 基于负载特征学习的动态缓存:例如基于请求到达间隔预测的动态缓存方案 Serverless in the Wild [ASPLOS'20];学习长短期负载变化特征的动态缓存方案 INFless [ASPLOS'22];基于优先级的可替换缓存策略FaasCache [ATC'21];面向异构服务器集群的低成本缓存方案 IceBreaker [ASPLOS'22]。这些动态缓存方案根据负载特征学习决定实例缓存数量或时长,从而在降低冷启动调用率的同时改善缓存资源消耗。
- 优化请求分发提高命中率:例如兼顾节点负载和本地化执行的请求调度算法 CH-RLU [HPDC'22]。通过权衡节点负载压力和缓存实例的命中率来对请求的分发规则进行优化设计,避免节点负载过高导致性能下降,同时兼顾冷启动率。
- 改善并发/实例共享或复用:例如允许同一函数工作流的多个函数共享Sandbox环境 SAND [ATC'18];使用进程或线程编排多个函数到单个实例中运行 Faastlane [ATC'21];提高实例并发处理能力减少实例创建 Fifer [Middle'20]; 允许租户复用其它函数的空闲实例减少冷启动时间 Pagurus [ATC'22]。这些实例共享或者复用技术可以同缓存方案结合使用,降低冷启动带来的性能影响。
总结
Serverless的无状态设计赋予了函数计算高度弹性化的扩展能力,然而也带来了难以避免的冷启动问题。消除Serverless函数的冷启动开销还是从降低函数冷启动率和加速实例启动过程两个角度综合入手。对于冷启动开销比较大的函数,在函数计算框架的设计机制中进行优化,尽量避免冷启动发生;当冷启动发生时,采用一系列启动加速技术来缩短整个过程进行补救。在Serverless平台的内部,冷启动的管理在实践中可以做进一步精细的划分,例如针对VIP大客户,针对有规律负载的,或是针对冷启动开销小的函数,通过分类做定制化、有目的的管理可以进一步改善系统效率。
文章来自:PaaS技术创新Lab,PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!
PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html
参考文献
[1] 刘方明, 李林峰, 王磊. 华为Serverless核心技术与实践[M]. 北京: 电子工业出版社, 2021.11.
[2] Zijun Li, Linsong Guo, Jiagan Cheng, Quan Chen, Bingsheng He, Minyi Guo: The Serverless Computing Survey: A Technical Primer for Design Architecture. ACM Comput. Surv. 54(10s): 220:1-220:34 (2022).
Serverless冷启动:如何让函数计算更快更强?的更多相关文章
- Microsoft Hyperlapse——让第一人称视频更快更流畅
Hyperlapse--让第一人称视频更快更流畅" title="Microsoft Hyperlapse--让第一人称视频更快更流畅"> 职业摄影师Nick Di ...
- Mockplus更快更简单的原型设计
更快更简单的原型设计 https://www.mockplus.cn/ Mockplus,更快更简单的原型设计工具.快速创建原型,一键拖拽创建交互,团队协作省事省力.微软.华为.东软.育碧.Oracl ...
- 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)
source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...
- CPNDet:粗暴地给CenterNet加入two-stage精调,更快更强 | ECCV 2020
本文为CenterNet作者发表的,论文提出anchor-free/two-stage目标检测算法CPN,使用关键点提取候选框再使用两阶段分类器进行预测.论文整体思路很简单,但CPN的准确率和推理速度 ...
- 不妨试试更快更小更灵活Java开发框架Solon
@ 目录 概述 定义 性能 架构 实战 Solon Web示例 Solon Mybatis-Plus示例 Solon WebSocket示例 Solon Remoting RPC示例 Solon Cl ...
- 安装好Windows 8后必做的几件事情,让你的Win8跑的更快更流畅。
1.关闭家庭组,因为这功能会导致硬盘和CPU处于高负荷状态. 关闭方法:Win+C-设置-更改电脑设置-家庭组-离开 如果用不到家庭组可以直接把家庭组服务也给关闭了:控制面板-管理工具-服务-Home ...
- Swift 4.0 正式发布,更快更兼容更好用
Swift4现已正式发布!Swift4在Swift3的基础上,提供了更强大的稳健性和稳定性,为Swift3提供源码兼容性,对标准库进行改进,并添加了归档和序列化等功能. 你可以通过观看WWDC2017 ...
- Grafana 系列文章(十一):Loki 中的标签如何使日志查询更快更方便
️URL: https://grafana.com/blog/2020/04/21/how-labels-in-loki-can-make-log-queries-faster-and-easier/ ...
- js 性能基准测试工具-告别可能、也许、大概这样更快更省
平时写js经常遇到这样做是不是更快点?但又没有具体简单可测试的工具,最近也倒序看博客园司徒正美 js分类下的文章 [ps:去年灵光一闪,发现看博客园排名前100的博客.按照文章分类倒序看是学习最快的方 ...
- 更好更快更高效解析JSON说明
现在来一个实例解析类,直接就把解析JSON到QVariant去了.唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过, ...
随机推荐
- Eolink Apikit 如何进行自动化测试?
自动化测试是一种软件测试方法,利用自动化工具和脚本来执行测试用例,以验证软件应用程序的功能.性能.稳定性等特性.自动化测试的主要目的是提高测试效率.减少测试成本,并确保软件的质量和可靠性. 作为测试人 ...
- Codeforces Round 902 Div 1 (CF 1876)
A. Helmets in Night Light 按花费 sort 一下,\(b<p\) 就让他用 \(b\) 的花费告诉别人,剩下的人一开始用 \(p\) 的花费告诉即可. B. Effec ...
- helm仓库harbor搭建及上传helm
1.仓库搭建(harbor) 注意: 基础环境为docker 使用docker-compose安装 1.1.docker安装 # 安装需要的软件包 # yum-util 提供yum-config-ma ...
- vue本地能够访问图片,打包项目之后图片无法访问
//template中 <img :src="boxHerf" /> //js let boxHerf = ref('/src/assets/images/contai ...
- KingabseES例程-事实数据与规则的匹配校验
KingabseES例程-事实数据与规则的匹配校验 背景 使用规则,对数据进行校验,比如电商的用户购物订单,是否合法.这就需要订单的多维度,如 用户.地区.物流.支付手段.供应商 等各类信息,进行动态 ...
- 微服务系列-使用WebFlux的WebClient进行Spring Boot 微服务通信示例
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 概述 在之前的教程中,我们看到了使用 RestTemplate 的 Spring Boot 微服务通信示例. 从 5.0 ...
- 多数元素 (3.12 leetcode每日打卡)
给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [3,2,3] ...
- 支持向量机SVM:从数学原理到实际应用
本篇文章全面深入地探讨了支持向量机(SVM)的各个方面,从基本概念.数学背景到Python和PyTorch的代码实现.文章还涵盖了SVM在文本分类.图像识别.生物信息学.金融预测等多个实际应用场景中的 ...
- springBoot + 工厂模式 实现 快递鸟、顺丰和快递100的物流查询
前言: 在Spring Boot中实现快递鸟.顺丰和快递100的物流查询功能通常需要与它们提供的API进行交互.当然使用他们的API 我们是需要申请和注册,从而去拿到 key 来进行调用.所以为注册的 ...
- MySQL锁粒度是什么意思?MySQL锁粒度是什么?
MySQL锁粒度就是我们通常所说的锁级别.数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源. MySQL数据库有三种锁的级别,分别是:页级锁.表级锁 .行级锁. 锁粒度 锁粒度就是我们通常所说 ...