Serverless分为冷启动和热启动,整个函数运行需要四步:下载代码,启动容器,初始化运行环境,运行代码。当函数第一次执行时,会经过完整的四个步骤,前三个过程统称为“冷启动”,最后一步称为“热启动”。
当容器从“冷态”开始启动时,函数需要: 从外部持久化存储中获取代码包; 逐步启动(Spin up)容器; 在内存中加载程序包代码; 运行函数的处理程序(handler)方法/函数。 这些步骤需要一段时间才能完成,尤其是第 1 到第 3 步。当容器已经变“热”后,它会直接跳到第 4 步,这样可以节省大量的时间并能使应用程序的响应更快。
“冷启动”的影响从几百毫秒到几秒或几十秒不等。有些原因会导致导致冷启动延迟。比如内存大小:分配给函数的内存越多,启动速度越快; 运行时:与编译运行时(Java、.NET、C#)相比,通常脚本语言(Python、Ruby、Javascript)在启动时的性能要好得多, 速度能提高 100 倍,; VPC:在虚拟私有云中运行的函数会有额外的延迟,通常要多一到两秒才能启动;尝试着将你的函数设计为运行于 VPC 之外;
代码包大小:包越大,启动新容器所需的时间越长,尽管如此,这可能是影响启动延迟最不重要的因素了。
以下 6 种策略可以解决或至少可以缓解容器启动延迟对 Serverless 应用程序的影响: 监控性能并记录相关指标, 增加内存分配, 选择更快的运行时, 将共享数据保存在内存中, 压缩程序包的大小, 保留一个预热的函数池, 使用时间序列预测。
在函数执行期间最好始终记录时间戳,并监控函数调用历史记录中的持续时间异常值。 每当它的性能低于预期时,查看日志并确定代码的哪些部分导致了性能的下降。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。