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

Lambda cold start possible solution?

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

这会不会很贵,或者我是否遗漏了一些东西,因为我现在已经设置好并且我认为它可以正常工作。

在我的冷启动时间大约为 10 秒之前,每个后续调用将在大约 80 毫秒内完成。现在,无论多么频繁,每次通话都在 80 毫秒左右。在说您的用户群增长之前,这是一个好方法,然后您可以关闭它吗?

我的第二个选择是使用 beantalk 并拥有一个服务器 运行 24/7 但这听起来很贵所以我不喜欢它。

据我所知,这是目前保持该功能热度的唯一方法。只有当你有很多这样的功能时,它才会变得昂贵。

考虑到您有多少个函数,每次 运行 它们需要多长时间以及需要多少内存,您必须自己计算为保持函数的活动性付出了多少代价你需要。

但是每 20 分钟一次相当于每月 2000 次,所以如果您使用例如128MB 并让它们在 100 毫秒内完成,那么你可以让很多这样的功能以 20 分钟的间隔保持活动状态,并且仍然处于免费层级 - 每个功能每月 20 秒。你甚至不需要在你获得更大的负载后将其关闭,因为此时它是无关紧要的。此外,您永远无法确保始终获得统一的负载,因此即使在那时您也可以保持心跳代码处于活动状态。

虽然我的猜测是,因为保持一个函数的运行成本非常低(特别是如果你有一个特殊的参数使它们立即 return)并且差异如此之大(10 秒与 10 秒)。 80 毫秒)然后几乎每个人都会这样做 - 几乎没有任何借口不这样做。在那种情况下,我希望亚马逊要么反对这种做法(通过使其变得比现在更难或更昂贵——这不是明智之举),要么在未来不再需要它。如果热启动和冷启动之间的差异是 100 毫秒,那么没有人会打扰。如果是 10 秒,那么每个人都需要解决它。

运行一秒钟前的代码和 运行 一个月前的代码之间总是会有区别,因为所有它们在 RAM 中并准备就绪会浪费大量资源,但我看不出为什么不能使这种差异变得不那么明显,甚至只需要几个步骤而不只是热启动和冷启动。

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

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

如果您希望冷启动时间接近零,保持功能温暖是可行的方法,如 rsp 所建议的那样。

除了为lambda增加内存外,还有一种减少冷启动的方法:使用Graal native-image工具。 jar 被翻译成字节码。基本上,我们会做一部分工作,这是在 aws 上完成的。当您构建代码时,加载到 AWS - select "Custom runtime",而不是 java8.

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

注意:

but it also has its limitations; it does not support dynamic class loading, and reflection support is also limited

Azure 有针对无服务器实例的预热解决方案(Link)。如果他们实施了这将是 AWS lambda 中的一个很棒的功能。

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

点击服务器不会解决用户同时请求的情况,或者同一页面异步发送几个 api 请求的情况。

更好的解决方案是将 'warmed-up' 转储到 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,尝试消除笨重的库
  • 创建多个 'microservices' 以减少多个用户使用同一服务的可能性

https://www.jeremydaly.com/15-key-takeaways-from-the-serverless-talk-at-aws-startup-day/

查看更多

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

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

从上面你会得到一个响应非常快的 lambda 实例......但是后续的并发调用可能仍然会受到影响 "cold-start"。

此外,您可以配置应用程序自动缩放以动态管理 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

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