【问题标题】:How do I force a complete cold start of an AWS lambda function on a VPC?如何强制在 VPC 上完全冷启动 AWS lambda 函数?
【发布时间】:2019-08-07 22:26:23
【问题描述】:

我有一个用 Python 编写的 lambda 函数,它使用几个重量级依赖项(NumPy、pandas、goodtables 等),并且还连接到 VPC(用于访问 Postgres RDS 实例)

这个函数的冷启动执行时间很长(16.2秒),在一段时间(> 4-6小时)后执行

但是,如果我更新函数代码并再次调用它(在第一次执行后不久),冷启动执行时间会大大减少(3 秒)

如果我再次调用该函数而不更新它所以这是一个热启动,执行时间会进一步下降(313 毫秒)

我怀疑第一次冷启动(16.2 秒)是 Lambda 设置 ENI 以访问 VPC 资源,并且 ENI 在第二次冷启动(3 秒)期间被重用,因此重新创建 ENI 所需的时间是避免。

我正在尝试优化这个函数的冷启动时间,并希望它从头开始,看看它在完全冷启动(即没有 ENI + 冷启动)时可以执行多快。

有没有办法做到这一点并反复做?

【问题讨论】:

  • 如果您创建一个新函数 而不仅仅是一个新的(或“更新的”)版本会怎样? ENI 管理操作和相关逻辑几乎完全不透明,但您可以在 CloudTrail 日志中回顾它们。
  • @Michael-sqlbot 我希望避免每次我想要冷启动时都创建一个新函数。但是,从aws ec2 describe-network-interfaces | grep -C5 <function_name> 的输出中,我可以看到是否附加了 ENI 以及附加时间(如果已附加)。如果我可以分离/删除这个 ENI,你认为它会强制 Lambda 在下次调用时重新创建 ENI?
  • 您可以尝试一下,但我怀疑它是否会按您的预期工作。 Lambda 不希望您从它下面拉出接口,您可能会发现这只会使函数完全停止工作。不确定您是否反对创建新功能。整个过程可以使用 aws-cli 自动化。
  • @Michael-sqlbot 我不知道我可以使用 aws-cli 自动化它。是否可以使用现有函数中的代码创建新函数而无需上传新的 ZIP?
  • aws lambda create-function 接受 --code 从 S3 获取 zip 文件或接受 --zip-file 直接上传 zip。

标签: amazon-web-services aws-lambda performance-testing


【解决方案1】:

您可以打开内存,保存并重新设置。

您还可以添加新的环境变量。

这会强制释放所有现有的暖 lambda,并在下一次调用 lambda 时进行新的冷启动。

【讨论】:

  • 如果我没记错的话,这不起作用(请参阅我的问题),因为没有重新创建 ENI
  • 谢谢 - 我确实看到了这个问题,实际上我们一直使用这种方法,也许当前的 ENI 需要一些时间来处理?
  • 将内存更改为较低的值然后备份对我有用。
  • 感谢这个答案,在过去的一年里,我一直在使用添加或只是修改一个环境变量的方法。我通常只是创建一个新的,例如 forceRestart 并增加计数器。
【解决方案2】:

您可以尝试发布新版本的 lambda 函数来进行测试,而不仅仅是修改代码。根据 AWS 的说法,每次发布 lambda 函数的新版本时,运行函数的所有容器都会被销毁然后重新创建,这应该会强制完成冷启动。

【讨论】:

  • 如果你的意思是运行update-function-code,这就是我目前所做的,它会冷启动我的 lambda,但冷启动时间不到 5 秒,所以我怀疑 ENI 被重复使用而不是重新已创建。
  • 不,我不是。让我试试看,我会回复你的。
  • 不,除了发布新版本的功能外,它没有做任何事情。冷启动时间不受影响(2.5 秒)。
  • @MatusDubrava 更新功能代码也发布了一个新版本——只是没有编号的版本。 $LATEST 指向新发布的匿名版本。
【解决方案3】:

我想知道同样的事情,虽然您可以在测试场景中将保留计数“限制”为零,但在生产场景中这很可能不是一个可行的选择。为此,请查看Force Discard AWS Lambda ContainerRestarting AWS lambda function to clear cache 中的答案。

【讨论】:

  • 我得试试看。但是,我不确定在这种情况下 ENI 是否会被销毁
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2018-04-14
  • 2021-11-06
  • 2022-10-04
  • 2019-11-21
  • 2020-07-02
相关资源
最近更新 更多