Skip to content

Latest commit

 

History

History
45 lines (33 loc) · 4.93 KB

File metadata and controls

45 lines (33 loc) · 4.93 KB

冷启动

本文章是关于冷启动的一些讨论

冷启动原理

我们知道开发者在开发Serverless应用时候,无需关注代码的运行环境,因为在函数运行时候,函数计算平台已经帮我们准备好运行环境了。但是Serverless容器的启动需要一段时间准备,这个启动的过程如下: 冷启动是指在函数调用链路中的代码下载、启动函数实例容器、运行时初始化、代码初始化等环节。当冷启动完成后,函数实例就绪,后续请求就能直接被执行。

冷启动优化策略

精简代码包

开发者要尽量缩小代码包。去掉不必要的依赖。例如,在Node.js中执行npm prune命令,在Python中执行autoflake 。另外,某些第三方库中可能会包含测试用例源代码,无用的二进制文件和数据文件等,删除无用文件可以降低函数代码下载和解压时间。

选择合适的函数语言

通常Java 运行的冷启动时间高于其他语言,Python的冷启动时间远低于nodejs。使用 Pyhthon这样轻量级语言可以大幅降低长尾延时

选择合适的内存

并发量一定的情况下,函数内存越大,冷启动表现越优。您可以使用内存&并发度探测工具进行合理的评估

避免不必要的配置

VPC的初始化需要引入创建并挂载用户ENI,这个操作可能是数秒级别的。如果是没有需求的函数,不配置VPC功能对冷启动帮助很大。

单实例多并发

各云厂商的函数计算通常是请求级别的隔离,即当客户端同时发起三个请求到函数计算,理论上会产生三个实例来进行应对,这个时候可能会涉及到冷启动问题,可能会涉及到请求之间状态关联问题等。阿里云函数计算 提供单实例多并发能力,允许单个函数处理多个请求。

降低冷启动概率

使用Initializer 函数入口,函数计算会异步调用初始化接口,消除掉“User Code Init” 的时间。 Initializer函数可以引导用户将业务逻辑分为初始化逻辑和请求处理逻辑,并提取初始化逻辑放入Initializer函数中,比如深度学习场景下加载规格较大的模型、数据库场景下连接池构建、函数依赖库加载等。函数计算保证在请求处理函数执行之前,初始化函数必须成功执行过一次并且只有一次,不仅保证函数的正常执行,同时规避用户系统/函数升级带来的冷启动开销,帮助用户实现业务系统的热升级

使用定时触发器预热函数

利用 实例空闲后隔一段时间才会被回收 的特点,可以通过定时触发函数执行的方法,来实现实例预热。本插件Keep-warm-fc,就是帮助用户方便的享受定时预热的能力,有效降低冷启动概率

混合模式

用户侧的冷启动一般难以消除。如果函数对延时非常敏感,您可以为函数设置预留模式实例,或者在同一个函数里同时使用预留模式实例和按量模式实例。 预留模式实例的分配和释放由您管理,根据实例的运行时长计费。当负载对资源的需求超过预留模式实例的能力后,系统自动使用按量模式实例,从而在性能和资源利用率上获得平衡。通过预留模式实例,您能够根据函数的负载变化提前分配好计算资源,系统能够在扩容按量模式实例时仍然使用预留模式实例处理请求,从而彻底消除冷启动带来的延时。 当您混合使用预留模式实例和按量模式实例时,保证优先使用预留模式实例。假设您为函数预留了10个实例,如果一秒内需要的实例数超过10个,系统会创建新的按量模式实例处理请求。判断一个实例是否满载和该实例上的并发请求数配置有关。系统追踪每个函数实例上正在处理的请求数,当并发的请求数达到您设定的上限后,系统会选择其他的函数实例。当所有实例的请求数都达到上限后,创建新的实例。预留模式实例由您管理,即使没有请求,您也需要为闲置的预留模式实例付费。按量模式实例由函数计算系统管理,系统在适当的时候将回收没有请求处理的闲置按量模式实例。您只需为按量模式实例实际处理请求的时间段付费。