随着并发实例的增加,AWS Lambda 性能大幅下降

AWS Lambda Performance Drops Heavily with Increasing of Concurrent Instances

在我们的应用程序 (.net core) 中有一个复杂的面向 CPU 的算法。每次执行通常需要 2-3 分钟。现在我们在后台服务中按顺序执行它。因此,我们每小时只能管理大约 25 次成功执行,这在需求量很大时是不够的。考虑到这是一项高度面向 CPU 的工作,在多线程中执行也无济于事。事实上,多线程的结果更差。

所以我想到了使用 AWS Lambdas。所以我创建了一个能够执行逻辑的 Lambda 函数,它由 AWS SQS 触发。因此,每当我需要执行逻辑时,一条消息就会被推送到队列中,Lambda 会挑选并执行它。

当只有一个请求时,Lambda 每次执行也需要 2-3 分钟,这没关系。为了以防万一,我将 Lambda 的超时设置为 15 分钟。

但是,当有大量请求时(例如:5 分钟内 1000 个),问题就开始了。正如预期的那样,Lambda 增加了实例的数量。但这最终会降低所有实例的性能。事实上,几乎所有的人都无法在 15 分钟的超时时间内完成工作。

所以我假设 Lambdas 的所有并行实例都分布在 one/few PC 中,它们共享 same/few CPUs,最终模拟了我最初使用多线程时的情况.与我最初的想法相反,每个实例都会获得配置的内存(分配 512 MB。它通常需要少于 180MB)并且足够 CPU。

包大小为 15Mb。由于冷启动时间对我来说不是什么大问题,所以我认为预配置的并发性也对我没有帮助(不确定)。此外,它需要配置一个特定的版本,这将在后续部署过程中增加很多麻烦。

希望问题清楚。有没有人遇到过这样的事情或知道如何克服这个问题?

谢谢。

根据问题的描述,可以推断瓶颈不在Lambda或SQS。问题的根本原因可能是数据访问层。添加更多并行线程来访问数据只会增加数据访问层的负担。因此会降低性能。

以下是可能提高数据访问层性能的解决方案:

  1. 在Database前面加一个缓存,用来处理读请求
  2. 增加数据库服务器的内存或机器类型
  3. 将数据库存储移动到高性能 SSD 卷
  4. 为数据库添加只读副本并将所有读取请求定向到副本。
  5. 切换到 AWS Aurora 数据库,它提供 5 倍的性能提升。