随着无服务器和FaaS生态的不断发展,以及空之前小程序的繁荣,越来越多的企业和个人用户将自己的应用和小程序部署到腾讯云的无服务器云功能平台。然而,FaaS场景下高并发、大规模、快速启动的需求也给我们带来了巨大的挑战。因此,我们构建了新一代无服务器功能计算平台,在安全性、可用性和性能方面进行了全面升级。
新平台使用腾讯云开发的轻量级虚拟化技术。microVM启动时间缩短至90毫秒,功能冷启动降低至200毫秒,支持上万个计算节点同时扩容。同时,依靠新的隧道方案,功能与VPC网络之间的通信时间从原来的秒级降低到毫秒级。
注:本文整理自腾讯云专家工程师周和腾讯云高级工程师李彦博在Kubecon2019上的分享。原分享主题为“加速:无服务器平台下的冷启动优化”。本文主要分享云功能冷启动优化的实践,下篇文章将分享云功能接入VPC网络的优化。
本文分为三个部分。首先介绍了腾讯云功能的架构设计。其次看函数的冷启动是如何产生的,冷启动涉及哪些过程。最后分享一些腾讯云功能的优化方法。
腾讯云功能架构设计
功能腾讯云SCF目前提供传统事件触发功能、HTTP调用功能、HTTPweb服务三种业务场景的支持,支持大量微信小程序的运行、公有云服务的快速增长、腾讯自有业务的云运营。微信小程序开发者从传统的主机和容器部署迁移到函数计算,在一个IDE开发环境中完成前端和后端服务的部署,大大提高了小程序的开发效率。
因此也面临着多业务场景、多租户的安全隔离、高并发功能实例的伸缩、百万级功能实例的集群管理、数十毫秒的冷启动延迟等诸多挑战。对于一些主动功能,冷启动的问题需要通过调度来解决。
基于上述需求和挑战,我们在控制流和数据流、虚拟化层、网络层和调度层等模块进行了彻底的重新配置和优化。
1。控制流和数据流模块根据它们的职责被解耦
如上图所示,蓝色部分是控制流部分,管理函数的生命周期,API层提供管理接口。元数据记录到数据库后,会向消息系统发送一个副本,后续的管理模块通过消息队列解耦。例如,在创建函数的场景中,网络部署模块收到消息后,负责打开函数的转发路径以访问VPC资源。
功能管理模块负责根据安装情况检查代码,并将其重新打包到代码仓库中,以便后续下载和部署。调度模块可以做一些资源的预创建和实例的预部署,元数据模块负责将管理流的数据同步到数据流的缓存系统,供后续函数调用。
这样API就不需要关注函数管理的底层细节,控制流和数据流也不会干涉。
2。轻量级虚拟化的解决方案在计算层实现
功能节点从传统虚拟机切换到轻量级虚拟机系统,提高了虚拟机并发部署的规模和速度,也实现了多租户间的安全隔离,后面会详细介绍。
3。自动缩放自动伸缩模块
基于函数请求的实时计算的模式,函数实例的动态伸缩,优化函数冷启动的体验,控制函数计算平台本身的成本。
4、VPC网络货运代理
该功能通常需要访问VPC网络或公共网络中的存储资源,这涉及到网络路径的开放。目前,实现这一目标的常用方法是绑定d性网卡,部署NAT网关,这在部署功能实例的过程中需要花费大量的时间。后面李彦博会详细介绍腾讯云功能如何优化这个问题。
功能冷启动优化实践
介绍完腾讯云功能的架构,接下来,详细看看云功能冷启动相关的问题和优化思路。
函数的冷启动是指第一次调用函数时,平台部署函数实例的过程。不仅仅是函数计算,也许一切都有冷启动。比如TCP通信前的三次握手,HTTPS接入的初始安全验证过程等等。
那为什么函数冷启动在函数计算中广受关注,函数计算平台也在不断优化这个问题呢?
有两个主要原因:
从流程图中,我们可以看到函数的冷启动涉及到哪些过程。黄色路径是函数实例的现有热调用。函数实例复用,热调用延迟毫秒级。如果没有示例,您将进入右侧蓝色部分的冷启动流程。
耗时的冷启动主要在以下三个方面:
接下来,我们将从轻量级虚拟机系统优化、代码缓存、VPC转发代理和实例预创建等方面介绍优化结果。
首先,是轻量级虚拟机系统的优化。基于腾讯云现有的CVM系统,主要优化了资源调度模块和底层虚拟化层面的耗时。改善资源调度的并发计算和耗时,削减虚拟化级别,大幅减少虚拟机启动时间。虚拟机隔离和访问策略也通过预同步方案减少了网络的有效时间。
对于虚拟机调度,如果要考虑全局最优调度,需要考虑的因素很多,比如满足虚拟机配置多样化的调度,CPU亲和与反亲和的调度,容灾部署组的调度,物理资源利用率最大化等。我们看了一下现有系统调度决策的因素,有20多种,所以规模比较大的时候,调度都是秒级的。
在功能的场景下,根据功能运行的配置规范统一虚拟机的标准化配置,如CPU型号配置、内存大小、存储配置和类型等。此外,可用的物理机资源是离线计算排序的,在调度时可以直接按顺序匹配,从而将调度物理机的 *** 作延迟降低到毫秒级。
接下来是虚拟化级别。从传统qemu/kvm虚拟机启动到机器可用的时间通常是几分钟。卡塔和鞭炮在业内的方案是通过切割qemu和虚拟机镜像来加速虚拟机的创建和启动。腾讯云虚拟化团队也使用了类似的方案,但做了进一步的优化。
在物理机上,先做一个基本的虚拟机,完成 *** 作系统、相关内核模块、驱动和一些用户态组件的初始化,然后将虚拟机的内存状态、CPU寄存器等信息保存到共享内存中,完成虚拟机模板的创建,也就是图中的Basepoint。
以后需要创建轻量级虚拟机时,直接克隆并通过虚拟机模板运行,然后需要修改关于mac、ip、主机名等唯一信息。在虚拟机内部,方式类似于本地热迁移。
代码下载是冷启动的另一个耗时部分。根据代码包的大小,可能需要几十毫秒到几秒钟的时间。这里的腾讯云函数分两级缓存代码。第一层是虚拟机的本地缓存。同一个租户的所有函数都被完整缓存在虚拟机中,这样就保证了所有函数在第一次调用时都不会被下载,即使之前没有调用过。二级缓存是可用区域内的缓存,按照建网标准的要求,一个可用区域内的延迟为1~2毫秒。因此,我们将同一区域的所有代码缓存到每个可用区域,以确保代码可以在可用区域下载,从而减少下载时间。
之前分享的优化方向主要在降低冷启动延迟。当然,最好的情况是可以提前创建,避免冷启动。这方面我们做了一个自动实时伸缩系统,通过二级函数监控数据上报,计算函数并根据资源需求(考虑成本)预创建或销毁函数实例。
在并发预测部分,我们尝试了一些方法,包括函数周期调用规则的数据分析,机器学习等。我们发现函数并发的维度波动很大,分分钟内可能增加或减少几次,一般以天为周期。但是并发的峰谷时间偏差比较大,所以我们最终选择了实时计算快速扩展的方案。
如图,Autoscale模块在监控函数并发增长时,计算需要扩展的实例数量,调用调度器模块快速部署实例,满足后续并发增长。在体积减小的过程中有一个冷却时间,在此期间有频繁的峰谷交替出现。在冷却时间之后,逐步进行体积减小。从我们的实际运行效果数据来看,冷启动的问题几乎可以避免。
两个可预测的预启动示例
最后,介绍了两种可预测的预启动情况。第一个是函数相互调用的场景:
比如图中函数A调用B和C,如果只预启动了函数A,而函数B和C还是冷启动,最后的表现就是函数A的调用延迟增加了。因此,平台需要根据函数的调用关系,预先启动被调用函数的整个路径。
第二个场景是功能代码变更和版本切换的场景:
如果左边的函数调用最新版本,开发者更新代码后,流量并不能立即切换到新代码,而是需要提前启动一些实例,根据当前并发部署新代码,以保证调用时延的顺畅和不过分。右边的函数通过别名调用V1版本。如果此时开发者将30%的流量切换到V2版本,平台需要根据当前的并发量计算出30%所需的实例数量,并在切换流量前部署V2功能实例。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)