Amazon web services AWS Lambda性能随着并发实例的增加而大幅下降

Amazon web services AWS Lambda性能随着并发实例的增加而大幅下降,amazon-web-services,.net-core,aws-lambda,amazon-sqs,Amazon Web Services,.net Core,Aws Lambda,Amazon Sqs,在我们的应用程序(.net内核)中,有一个复杂的面向CPU的算法。每次执行通常需要2-3分钟。现在,我们在后台服务中按顺序执行此操作。因此,我们每小时只能管理大约25次成功执行,这在需求量很大时是不够的。考虑到这是一个高度面向CPU的作业,在多线程中执行也没有帮助。事实上,对于多个线程,它给出了更糟糕的结果 所以我考虑使用AWS Lambdas。因此,我创建了一个能够执行逻辑的Lambda函数,它由AWS SQS触发。因此,每当我需要执行逻辑时,一条消息就会被推送到队列中,Lambda挑选并执行

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

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

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

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

因此,我假设lambda的所有并行实例都跨在一台/几台PC机上,它们共享同一台/几台CPU,最终模拟了我最初使用多线程时的情况。与我最初的想法相反,每个实例都配置了内存(分配了512MB,通常需要少于180MB)和足够的CPU

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

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


谢谢。

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

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

  • 在数据库前面添加缓存,以处理读取请求
  • 增加数据库服务器的内存或计算机类型
  • 将数据库存储移动到高性能SSD卷
  • 为数据库添加读取副本,并将所有读取请求定向到副本
  • 切换到AWS Aurora DB,它提供5倍的性能提升

  • 你能澄清一件事吗。如果在SQS中只有一条消息,那么它运行得很快。但是如果你有很多,它会慢吗?因此,在后一种情况下,您的函数可能会获取10条消息,并且lambda会在循环中处理它们。依赖一些外部API或db?也许瓶颈不是lambda,而是它使用的东西?例如,如果一个func。调用外部api,工作速度很快。但是,如果有1000个函数同时调用同一个api,则会阻塞api服务器,导致函数等待响应的时间过长?@Marcin:是的。与Postgres数据库通信。一次执行会执行一些读写操作。一个问题:将保留并发设置为10这样的值可以保证一次只有10个实例?是的。您可以使用保留并发设置限制并发lambda调用的数量。检查数据库。看起来它可能会被1000次并发读写阻塞?对于fifo,只有使用相同的组(消息组id)才能确保排序。因此,如果您有五个组,则只有5个并发lambda将处理它们(每组一个)。谢谢。是的,我就是这样。是DB。