Python 与本地并行Lambda调用相比,AWS Lambda到Lambda并行调用降低了性能

Python 与本地并行Lambda调用相比,AWS Lambda到Lambda并行调用降低了性能,python,aws-lambda,Python,Aws Lambda,我有一个“orchestrator”lambda,它接受一个参数列表,并为该列表中的每个参数同步调用一个“worker”lambda。然后,编排器等待所有工作lambda完成并返回聚合结果。编排器收到一个包含122项的列表,我遇到了一些奇怪的行为 当我在我的主机上测试orchestrator lambda时,它可以完美地工作,并行调用所有122个工作lambda并返回结果。它大约在1分钟内完成,这与最长的单个worker调用的时间长度相同。这是有意义的,因为所有lambda都是并行调用的 但是,

我有一个“orchestrator”lambda,它接受一个参数列表,并为该列表中的每个参数同步调用一个“worker”lambda。然后,编排器等待所有工作lambda完成并返回聚合结果。编排器收到一个包含122项的列表,我遇到了一些奇怪的行为

当我在我的主机上测试orchestrator lambda时,它可以完美地工作,并行调用所有122个工作lambda并返回结果。它大约在1分钟内完成,这与最长的单个worker调用的时间长度相同。这是有意义的,因为所有lambda都是并行调用的

但是,当我在lambda环境中运行orchestrator lambda时,它似乎在性能下降的情况下运行。我捕获的性能指标表明,本地版本每秒返回约9个结果,而lambda托管的版本每秒返回约2个结果。请参阅所附图表,以说明这一点

我的本地主机和lambda环境都运行相同版本的python(3.7.4),1.7GB内存和一个完整的vCPU分配给orchestrator和worker lambda。作为参考,编排器lambda的代码为和

本地表现:

Lambda托管性能:


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

问题似乎在于我如何使用asyncio。我使用boto3 lambda客户端调用worker lambda,如下所示:

loop = asyncio.get_running_loop()  
await loop.run_in_executor(lambda_client.invoke, ...)
async with aioboto3.client('lambda') as lambda_client:
    response = await lambda_client.invoke(...)
这似乎是lambda环境中的阻塞,但不是在我的主机上,这导致了性能下降。我不知道为什么

我通过重构代码以使用aioboto3库解决了这个问题,如下所示:

loop = asyncio.get_running_loop()  
await loop.run_in_executor(lambda_client.invoke, ...)
async with aioboto3.client('lambda') as lambda_client:
    response = await lambda_client.invoke(...)
这在lambda中实现了与主机相同的性能