函数计算冷启动优化最佳实践

本文介绍如何通过设置函数计算的最小实例数优化弹性实例的冷启动问题,提高函数性能。

什么是冷启动

函数计算默认使用弹性实例,即按请求自动弹性,收到请求时系统自动创建实例处理请求,无请求后实例自动回收。您只需要根据实例执行请求的时间按需付费。这种弹性模式降低了管理应用资源的难度,但也造成了冷启动、延时等性能问题。

冷启动是指在函数调用链路中的代码下载、启动函数实例容器、运行时初始化、代码初始化等环节。当冷启动完成后,函数实例就绪,后续请求就能直接被执行。

image

优化冷启动

冷启动的优化用户和平台配合完成。函数计算已经对系统侧的冷启动做了大量优化。对于用户侧的冷启动,建议您从以下几方面优化:

  • 精简代码包

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

  • 选择合适的函数语言

    由于语言理念的差异,Java运行时冷启动时间通常要高于其他语言。对于冷启动延迟敏感的应用,在热启动延迟差别不大的情况下,使用Python轻量语言可以大幅降低长尾延迟。

  • 选择合适的内存

    在并发量一定的情况下,函数内存越大,分配的CPU资源相应越多,因此冷启动表现越优。

  • 降低冷启动概率

    • 使用定时触发器预热函数。

    • 使用Initializer函数入口,函数计算会异步调用初始化接口,消除掉代码初始化的时间,在函数计算系统升级或者函数更新过程中,您对冷启动无感知。

混合模式

用户侧的冷启动一般难以消除。例如,在深度学习推理中,要加载大量的模型文件时;函数要和遗留系统交互,必须使用初始化耗时很长的客户端时。在这些场景下,如果函数对延时非常敏感,您可以设置函数的最小实例数≥1,请求到达时,冻结的资源快速唤醒开始处理请求。

设置函数的最小实例数≥1后,系统在处理请求时,优先分配请求至基于最小实例数启动的弹性实例,如果实例不能满足当前负载,系统自动扩容弹性实例作为补充,从而在性能和资源利用率上获得平衡。通过设置函数的最小实例数≥1,您能够根据函数的负载变化提前分配好计算资源,系统能够在扩容弹性实例时仍然使用基于最小实例启动的弹性实例处理请求,从而彻底消除冷启动带来的延时。

设置函数的最小实例数≥1后,系统在处理请求时,优先使用基于最小实例数启动的弹性实例,假设您为函数设置最小实例数为10个,如果一秒内需要的实例数超过10个,系统会创建新的弹性实例处理请求。判断一个实例是否满载和该实例上的并发请求数配置有关。系统追踪每个函数实例上正在处理的请求数,当并发的请求数达到您设定的上限后,系统会选择其他的函数实例。当所有实例的请求数都达到上限后,创建新的实例。

设置函数的最小实例数≥1后,即使没有请求,您也需要按照弹性实例(闲置)的单价付费,具体计费规则请参见计费概述。如果需要确保资源的使用在期望的范围内,可以通过配置实例数上限实现。