首页 > 解决方案 > 与本地并行 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 托管的性能

什么可以解释本地版本和 lambda 托管版本之间的性能差异?

标签: pythonaws-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 中实现了与我的主机相同的性能。


推荐阅读