【问题标题】:How does AWS Lambda know the amount of memory and CPU requirements needed to run my Lambda code?AWS Lambda 如何知道运行我的 Lambda 代码所需的内存量和 CPU 要求?
【发布时间】:2023-04-01 12:59:01
【问题描述】:

据我了解,AWS Lambda 在用户无法访问的 EC2 实例上运行上传的代码。它创建运行上传代码所需的运行时环境,管理权限并平衡负载。这就是我认为 AWS Lambda 在幕后所做的事情。

引用Wikipedia:

与在专用服务器、虚拟机或容器上持续运行的代码相比,不常用的无服务器代码可能会遭受更大的响应延迟。这是因为,与自动缩放不同,云提供商通常会在不使用无服务器代码时完全“关闭”无服务器代码。

这是有道理的,但 AWS Lambda 确实 claim 使用自动缩放:

AWS Lambda 通过运行代码以响应每个触发器来自动扩展您的应用程序。您的代码并行运行并单独处理每个触发器,根据工作负载的大小精确扩展。

我的问题是 -

  • AWS Lambda 如何分配内存和 CPU 来运行我的代码?
  • 我的所有 Lambda 请求是否都由单个 EC2 实例提供服务(如果有的话)?
  • 如果,那么当请求数量增加时,他们如何扩展?
  • 如果,那么如果他们必须为每次收到 lambda 请求时运行的代码创建运行时环境,他们如何减少延迟?

【问题讨论】:

  • Lambda 应用程序部署在容器中。您选择容器 RAM 大小并按容器运行时间计费。自动缩放发生在容器级别 - 更多容器实例开始处理增加的负载,或者如果它们的空闲时间超过可配置的跨度则终止
  • 如果您考虑the amount of vCPU cores you get,它会变得更加有趣

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


【解决方案1】:

Lambda 不知道它需要多少内存和 CPU - 您在设置函数时告诉它并相应地计费(设置函数后,您可以根据需要更改它)。

Lambda 不在单个 EC2 实例上运行,一般认为 Lambda 函数在 docker 容器中运行(它们在 EC2 实例上运行)——或者更有可能他们使用 AWS 的 EC2 Container 服务来编排所有这些 lambda 的。

它通过增加运行的实例数量而不是运行的 lambda 的大小来“扩展” - 因此,如果您一次用数百个调用淹没您的 lambda 函数,它不会增加您的 lambda 的内存或 cpu,它会旋转额外的实例来处理负载。

当 lambda 需要启动一个新实例时会有延迟 - 特别是如果您有一段时间没有运行它 - 通常称为冷启动 - 一旦请求不断进入,lambda 往往会保持就绪为下一个请求提供服务,因此后续调用比第一个 1-2 运行得快得多。一旦呼叫停止进入 - AWS 可能停止实例,但没有关于何时或为什么会发生这种情况的文档。我的经验是,只要有稳定的请求流,延迟就会非常低 - 当你进行冷启动时,它会导致再次启动它会产生“惩罚”。

如果您需要减少“冷启动”延迟,最简单的方法是指定更大的内存大小 - 内存和 CPU 会同时扩展,因此即使您的函数不需要更多内存,也可以为其提供更多内存将减少初始延迟。

【讨论】:

  • 感谢您的详细解答。在阅读了您回答中的冷启动位后,我想问一件事;如果我有一个需要不经常进行一些计算的要求,那么如果我使用 AWS Lambda 而不是在始终可用的服务器上部署一个完全成熟的 Web 应用程序,在成本方面会更好。冷启动不是这种无服务器架构的缺点吗?因为与 AWS lambda 相比,始终可用的服务器的延迟会更低?
  • 是的,这是一个折衷方案——对于一个不常用的函数,使用 Lambda 肯定更便宜(大多数情况下,可能会有例外)。但是我在 lambda 中运行的函数很少运行,我最终将它们移回 EC2 实例,因为当我确实需要运行它们时,我需要它们立即运行。
【解决方案2】:

TL:DR

直截了当:运行函数并查看 CloudWatch 日志。

- 如果您的代码占用大量 CPU:分配更多 RAM

示例:大量数学计算、加密库等

- 如果您的代码不是 CPU 密集型的:更少的 RAM

示例:使用远程 API、简单的对象转换。

RAM 作为缓存

您不必担心如何创建和销毁实例,您可以假设您的代码只会在每次需要时运行并且所有请求都会得到处理,只考虑有时它会是一个新的创建的实例,而其他时候将是现有实例(在同一实例的调用之间不会刷新 RAM),因此您可以重用数据库连接并将 RAM 用作同一实例中常用对象的缓存。

加长版

AWS Lambda 实例是如何以及何时创建的?

每个 AWS Lambda 实例一次只能处理一个请求,因此每次您的服务收到请求并且现有 Lambda 实例忙(或没有运行)时,它会自动部署一个新实例,最多为默认值1000 个 lambda 实例的数量。

您定义函数响应所需的最长时间,以限制每个请求的成本。

只要您对任何现有正在运行的实例返回响应,它就可以接收更多请求。

如果在这些实例上没有收到请求,现有实例会在大约 15 分钟后销毁。

所有正在运行的实例每约 4 小时回收一次。

流程管理

实例内部的进程在调用之间被冻结,包括所有子进程和异步回调。

初始化代码(在处理函数之外)仅在实例启动时执行,然后在调用之间冻结。

重要限制:

响应 HTTP 请求的 Lambda 函数最多只能在 30 秒内返回响应。

CPU 和内存分配

每个实例都有自己的独立内存,您可以定义分配给 lambda 以在 Lambda 控制台配置上运行的 RAM 量。更多的 RAM 等于更多的 CPU,但每秒的成本也更高。

您只需为您的代码从收到请求到返回的秒数付费

我如何知道我需要多少内存?

运行函数后,您可以使用 CloudWatch 查看函数实际使用的确切毫秒数和 RAM 量(以 Mb 为单位)并进行相应调整。

内存与 CPU

有时过多的 RAM 会被视为一种浪费,但这也意味着更多的 CPU 分配可以让您的函数在更短的时间内完成,从而降低成本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多