AWS Lambda如何知道运行Lambda代码所需的内存量和CPU要求?

Bil*_*uly 2 amazon-ec2 amazon-web-services aws-lambda

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

引用维基百科:

与在专用服务器,虚拟机或容器上持续运行的代码相比,不经常使用的无服务器代码可能遭受更大的响应延迟.这是因为,与自动扩展不同,云提供商通常在不使用时完全"旋转"无服务器代码.

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

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

我的问题是 -

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

E.J*_*nan 6

Lambda不知道它需要的内存和CPU的数量 - 您告诉它并在设置功能时相应计费(在设置之后,您可以根据需要更改它).

Lambda不在单个EC2实例上运行,通常可以理解Lambda函数在docker容器中运行(在封面下的EC2实例上运行) - 或者更有可能使用AWS的EC2 Container服务来执行所有这些lambda的编排.

它通过增加运行实例的数量来"扩展",而不是运行lambda的大小 - 所以如果你同时使用数百个调用充满你的lambda函数,它不会增加你的lambda的内存或cpu,它会旋转额外的处理负载的实例.

当lambda需要启动一个新实例时会有一个延迟 - 特别是如果你有一段时间没有运行它 - 通常被称为冷启动 - 一旦请求继续进入,lambda倾向于保持准备服务下一个请求,因此后续调用运行速度比前1-2快.一旦呼叫停止进入 - AWS 可能会降低实例,但没有关于何时或为何可能发生这种情况的文档.我的经验是,只要有稳定的请求流,延迟就会非常低 - 当你做一个冷启动时,它会招致'再次'让它再次出现.

如果你需要减少'冷启动'延迟,最简单的方法是指定一个更大的内存大小 - 内存和CPU规模串联,所以即使你的功能不需要更多的内存,给它更多的内存将减少初始延迟.

  • 是的,这是一种权衡 - 与Lambda一起使用不常用的功能肯定更便宜(大多数时候,可能有例外).但是我在lambda中运行的功能很少,我最终将它们移回EC2实例,因为当我确实需要运行它们时,我需要它们立即运行. (2认同)