【发布时间】: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