Serverless 冷启动:如何让函数计算更快更强?

news2025/2/27 20:41:06

问题背景

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).

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

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

相关文章

APT攻击及密码学

目录标题什么是APT攻击?APT攻击过程APT防御技术APT防御过程沙箱处理流程密码学什么是对称加密?什么是非对称加密?SSL工作过程什么是APT攻击? APT攻击即高级可持续威胁攻击,也称为定向威胁攻击,指某组织对特…

fastCGI快速上手

fastCGI OVERVIEWfastCGI一、CGI二、fastCGI三、fastCGI使用1.fastCGI和spawn-fcgi安装2.nginx fastcgi(1)nginx的数据转发(2)spawn-fcgi启动(3)fastCGI进程处理3.fastCGI总结四、其他1.fastCGI环境变量2.…

【图像分割】LabelMe基本使用/标注标签格式转换及可视化

前言 之前一直在做目标检测的相关内容,使用LabelImg标注检测数据轻车熟路。不过最近尝试探索一下图像分割场景,需要用到LabelMe标注用于分割的数据标签,本文进行过程记录。 图像分割数据标签示例 以道路分割为例,下图是deepglo…

基于MVC+SSH的文章发布系统源码数据库毕业论文

目 录 摘要 1 Abstract 2 1 绪论 1.1 课题背景 1.2 研究现状及发展趋势 1.3 课题意义与目的 1.4 研究内容 1.5 论文组织 2 开发工具和技术介绍 2.1 开发工具 2.1.1 Myeclipse简介 2.1.2 MySQL简介 2.1.3 Tomcat简介 2.2 开发技术 2.…

【LInux】MySQL高可用之主从复制

一、Mysql主从架构技术说明 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到 多个系统上去,这种分布的机制,是通过将Mysql的某一台主机(Master)的数据复 制到其它主(slaves&…

音频模块的介绍

一、术语总结 1.HIFI 级   “HIFI”一词通常指高保真音频(High-Fidelity Audio),是指尽可能保持音频信号的原始质量,让听众感受到最真实的音乐表现。因此,“HIFI级”通常指具有高保真音频性能的产品或设备&#xff…

音视频开发十六:SDL基础概念

SDL 纹理渲染 纹理 ​ 在SDL中,纹理是图像的描述信息。用SDL_Texture表示一个纹理对象(texture),它是一个用于存储像素数据的结构体类型。 渲染 ​ **互联网解释:**渲染是在电脑绘图中是指用软件从模型生成图像的…

【Linux】线程互斥详解:多线程会有什么问题?什么是互斥锁?C++怎么封装使用互斥锁?

多线程可以提高程序的并发性和运行效率,充分利用计算机的多核资源. 前面的几篇文章已经介绍了, Linux线程的基本概念、基本控制等内容. 我们已经看到了多线程可以提升运行效率等. 但是, 也发现了问题, 多线程可能会导致输出混乱、访问共享资源混乱、竞争等问题. 输…

Vue中 import ...与import{ }、import from ‘@路径‘ 与 import from ‘../路径‘

遇到的问题: 不带{ }以组件方式 引入后,用 组件名. 变量 的方式一直提示变量未定义的问题,改成直接 带{ }引入变量直接使用变量就不提示错误了,(不知道是不是我引入的包和他人不一样的原因...)&#xff0…

至尊宝工具箱 - 电商运营选品必备工具下载安装详细教程

简介 至尊宝插件是一款电商网络浏览插件,能够帮助店主更好地运营自己的网店,这款插件功能十分全面强大,可以实现搜主图、快速商家商品、优化商品标题等,通过帮助店家增加曝光量来增效销售,感兴趣的朋友快来体验。 下…

使用Superlink控制物联网网关远程调试PLC示例(PLC/HMI调试工具)

目录 1.Superlink工具使用说明 1.1软件安装 1.2账号登录 1.3设备查看 1.4菜单栏使用 2. Superlink网关远程调试网口/串口设备示例 2.1 远程调试西门子网口1200 PLC示例 2.2 远程调试欧姆龙232 PLC实串口通讯示例 3. 常见使用问题及技术支持 3.1 Superlink工具使用问题…

Mybatis核心

文章目录前言一、Configuration二、MappedStatement三、SqlSession四、Executor五、StatementHandler六、ParameterHandler七、ResultSetHandler八、TypeHandler总结前言 SqlSession是MyBatis提供的面向用户的操作数据库API。那么MyBatis底层是如何工作的呢?为了解…

vue.js表情文本输入框组件

文章目录参考链接效果图代码emoji.jsonEmojiText.vue使用参考链接 JS操作文本域获取光标/指定位置插入 vue.js支持表情输入 ttkwsd博客 效果图 代码 不能换行的bug已处理… emoji.json 表情图片放在public的emoji文件夹下面 emoji.json放在src/components/EmojiText文件夹…

Linux 生成pem文件 用于免密登录

1.在远程机器生成.pem文件 生成密钥对: $ ssh-keygen -t rsa -b 2048 -v 直接确认下一步 查看生成的密钥对: $ ls ~/.ssh/ 将私钥重命名至id_rsa.pem: $ mv ~/.ssh/id_rsa ~/.ssh/id_rsa.pem 修改~/.ssh/目录权限: $ chmod …

力扣sql中等篇练习(三)

力扣sql中等篇练习(三) 1 树节点 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # not in匹配上了返回的值是1,casw when里面也是可以使用not in和子查询的 # 注意去重的时候需要筛选掉null值 SELECT id,case when p_id is null then Rootwhen (id …

暄桐好作业之《临王蒙〈具区林屋图〉》

告诉大家一个好消息“暄桐好作业”栏目上新啦~除了与大家分享正在进行的课程好作业,还会向大家展示来自暄桐学长学姐们的优秀国画作品。希望正在上课的暄桐同学们能够从学长学姐的分享以及暄桐教室专业助教的点评中,从中获益并获得力量,继续努…

Java基础(十七):日期时间API

Java基础系列文章 Java基础(一):语言概述 Java基础(二):原码、反码、补码及进制之间的运算 Java基础(三):数据类型与进制 Java基础(四):逻辑运算符和位运算符 Java基础(五):流程控制语句 Java基础(六)&#xff1…

chatGPT开发公司

OpenAI是chatGPT的开发公司,成立于2015年,总部位于美国旧金山。OpenAI致力于开发和推广人工智能技术,包括自然语言处理、视觉识别、机器学习等领域,旨在推动人工智能技术对全球社会和经济的影响和发展。 除了chatGPT之外&…

日撸 Java 三百行day31

文章目录day31 整数矩阵及其运算面向对象思想java异常处理java中的getter和setter方法代码day31 整数矩阵及其运算 面向对象思想 结合之前day7和day8面向过程开发,只关注了矩阵加法和矩阵乘法的功能。而day31是面向对象开发,一个矩阵类,在这…

Python实现驾考自动答题,隔壁老王每次都100分....

人生苦短,我用python 不知道大家都考完驾照没? 这个驾照不管大家有没有,我相信大家都是这个: 朋友最近在考驾照,快考科一了… 我微微一笑当场给他整个活~ 用Python整了几十行代码,给朋友实现一下自动答…