Lambda冷启动可能的解决方案?

时间:2016-06-20 20:09:52

标签: amazon-web-services amazon-ec2 aws-sdk aws-lambda

调度lambda函数是否每20分钟调用一次,使用CloudWatch是摆脱lambda冷启动时间的最佳方法? (没有完全摆脱)......

这会变得昂贵还是我缺少一些东西,因为我现在已经设置好了,我认为它正在发挥作用。

在冷启动之前,时间将是10秒,每次后续呼叫都会在80毫秒内完成。现在每次通话都是大约80毫秒。这是一个很好的方法,直到你的用户群增长,然后你可以关闭它?

我的第二个选择是使用beanstalk并让服务器全天候运行,但这听起来很昂贵,所以我不喜欢它。

7 个答案:

答案 0 :(得分:14)

据我所知,这是保持功能正常的唯一方法。只有当你拥有很多这些功能时才会变得昂贵。

你必须自己计算一下,为了让你的功能保持活力,你需支付多少费用,考虑到它们有多少,每次运行需要多长时间以及你需要多少内存。

但每20分钟一次就像每月2000次,所以如果你使用例如128MB并使它们在100ms以下完成,那么你可以在20分钟的时间间隔内保持相当多的此类功能,并且仍处于免费等级 - 每个功能每月20秒。您甚至不需要在获得更大负载后将其关闭,因为此时它将无关紧要。除此之外,你永远无法确保一直都能获得统一的负载,这样即使在那时你也可以让你的心脏保持活跃的代码。

虽然我的猜测是,因为保持一个函数活着是如此便宜(特别是如果你有一个特殊的参数使它们立即返回)并且差异是如此之大(10秒对80毫秒)那么几乎每个人都会这样做 - 没有理由不这样做。在那种情况下,我希望亚马逊能够与这种做法作斗争(通过使其变得比目前更难或更昂贵 - 这不是一个聪明的举动)或者将来不需要它。如果冷启动和冷启动之间的差异是100毫秒,那么没人会打扰。如果是10秒,那么每个人都需要解决它。

运行一秒钟前运行的代码与一个月前运行的代码之间总是存在差异,因为将所有这些代码放在RAM中并准备就绪会浪费大量资源,但是我认为没有理由为什么这种差异不会太明显,甚至没有更多的步骤而不仅仅是冷热启动。

答案 1 :(得分:7)

您可以通过为Lambda函数分配更多内存来改善冷启动时间。使用默认的512MB,我看到用Java编写的函数的冷启动时间为8-10秒。使用1536MB内存可以提高2-3秒。

Amazon says真正重要的是CPU分配,但没有办法直接改变它。 CPU分配与内存成比例增加。

如果你想要接近零冷启动时间,保持功能温暖是要走的路,正如rsp所建议的那样。

答案 2 :(得分:0)

除了为lambda添加更多内存外,还有另一种减少冷启动的方法:使用Graal本机图像工具。罐子被翻译成字节码。基本上,我们会做一部分工作,这是在aws上完成的。构建代码时,在加载到AWS时-选择“自定义运行时”,而不是java8。

有用的文章:https://engineering.opsgenie.com/run-native-java-using-graalvm-in-aws-lambda-with-golang-ba86e27930bf

当心:

  

但它也有其局限性;它不支持动态类加载,并且反射支持也受到限制

答案 3 :(得分:0)

Azure具有针对无服务器实例(Link)的预热解决方案。如果他们在实施时,这将是AWS lambda的一项重要功能。

不是由用户在应用程序级别预热实例,而是由平台中的云提供商处理。

答案 4 :(得分:0)

命中服务器无法解决用户同时请求的情况,或者同一页面异步发送一些api请求的情况。

更好的解决方案是将“预热”转储到docker检查点中。当预热较快但所有库的加载速度较慢时,它对于动态语言特别有用。

有关详细信息,请阅读

https://criu.org/Docker

https://www.imperial.ac.uk/media/imperial-college/faculty-of-engineering/computing/public/1819-ug-projects/StenbomO-Refunction-Eliminating-Serverless-Cold-Starts-Through-Container-Reuse.pdf

其他提示:

  • 使用更多的内存
  • 在大多数基本库中使用Python或JavaScript,尝试消除笨重的库
  • 创建多个“微服务”以减少多个用户使用相同服务的机会

https://www.jeremydaly.com/15-key-takeaways-from-the-serverless-talk-at-aws-startup-day/上查看更多信息

答案 5 :(得分:0)

从2019年12月开始,AWS Lambda支持保留并发(因此您可以设置准备好并等待新调用的lambda函数的数量)[1]

这的缺点是,您需要为保留的并发付费。如果您为1设置并发性,则对于整个月24小时处于活动状态的128MB的lambda,将向您收取费用:1个实例x 30天x 24小时x 60min x 60sec x(128/1024)= 324,000 GB-sec (AWS为lambda免费套餐提供的几乎所有容量)[2]

从上面您将获得一个响应速度非常快的lambda实例...但是,随后的并发调用可能仍会遭受“冷启动”。

此外,您可以配置应用程序自动缩放以动态管理lambda的预配置并发。 [3]

参考:

  1. https://aws.amazon.com/blogs/aws/new-provisioned-concurrency-for-lambda-functions/
  2. https://aws.amazon.com/lambda/pricing/
  3. https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html

答案 6 :(得分:0)

Lambda 的冷启动取决于多种因素,例如您的实现、您使用的语言运行时间和代码大小等。如果您给 Lambda 函数更多的内存,您也可以减少冷启动。您可以阅读最佳做法https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html

无服务器社区也有关于性能的建议https://atlas.serverless.tech-field-community.aws.a2z.com/Performance/index.html

Lambda 团队还推出了 Provisioned Concurrency。您现在可以请求将多个 Lambda 容器保持在“超级就绪”状态,准备重新运行您的函数。这是降低冷启动可能性的新最佳实践。 官方文档 https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html?icmpid=docs_lambda_console