python - 与本地并行 lambda 调用相比,AWS Lambda 到 Lambda 并行调用降低了性能
问题描述
我有一个“orchestrator”lambda,它接受一个参数列表,并为该列表中的每个参数同步调用一个“worker”lambda。然后,编排器等待所有工作 lambda 完成并返回聚合结果。协调器传递了一个包含 122 个项目的列表,我遇到了一些奇怪的行为。
当我在我的主机上测试 Orchestrator lambda 时,它可以完美运行,并行调用所有 122 个 worker lambda 并返回结果。它在大约 1 分钟内完成,这与最长的单个工人调用的时间长度相同。这是有道理的,因为所有 lambda 都是并行调用的。
但是,当我在 lambda 环境中运行 Orchestrator lambda 时,它的运行性能似乎有所下降。我捕获的性能指标表明本地版本每秒返回约 9 个结果,而 lambda 托管版本每秒返回约 2 个结果。请参阅说明这一点的附图。
我的本地主机和 lambda 环境都运行相同版本的 python (3.7.4),具有 1.7GB 内存和一个完整的 vCPU 分配给 Orchestrator 和 worker lambdas。作为参考,编排器 lambda 的代码在此处和此处。
本地表现:
Lambda 托管的性能:
什么可以解释本地版本和 lambda 托管版本之间的性能差异?
解决方案
看来问题在于我如何使用 asyncio。我正在使用 boto3 lambda 客户端调用 worker lambda,如下所示:
loop = asyncio.get_running_loop()
await loop.run_in_executor(lambda_client.invoke, ...)
这似乎在 lambda 环境中被阻塞,但在我的主机上没有,这导致性能下降。我不确定为什么。
我通过重构我的代码以使用 aioboto3 库解决了这个问题,如下所示:
async with aioboto3.client('lambda') as lambda_client:
response = await lambda_client.invoke(...)
这在 lambda 中实现了与我的主机相同的性能。
推荐阅读
- debugging - 通过调用 isDebuggerPresent 来操作 eit
- python - 排列生成器代码中的条件和递归
- versionone - WinRM/Powershell 命令的 VersionOne Continuum 任务错误
- node.js - NPM 本地依赖的依赖没有解决
- sql - 在 SQL 中处理库存波动
- c++ - 以编程方式确定给定 processid 的应用程序状态
- c - sscanf 的格式说明符:%{format%}
- python - Scrapy:仅关注外部链接
- php - Laravel 背包,在列中显示地址(Json)
- javascript - 有没有什么地方 defaultChecked 比仅仅引用 checked 更有利?