【问题标题】:Lambda throttling below concurrency limitLambda 限制低于并发限制
【发布时间】:2018-11-30 07:03:48
【问题描述】:

我们使用 Lambda 为通过新闻媒体网站访问的 API(通过 API 网关)提供动力,接收波动但高负载的流量。我们开始遇到限制,因此我们将并发限制提高到 2000。但是,我们仍然每天多次遇到限制。

奇怪的是,在 CloudWatch 指标中,当我们受到限制时,并发请求的峰值约为 600 或更低。以 CloudWatch 图表为例:

以前有没有人经历过这种情况?你认为为什么会这样?我们能做些什么呢?

更多信息

  • 此图表涵盖了我们整个地区的所有 Lambda。
  • 当发生限制时,它会发生在所有 Lambda 实例中。
  • 我们主要通过 API Gateway 触发 Lambda,但也有少数通过 SNS 触发(数据速率相当高)。
  • 我们在所有 API 前面都有 CloudFront,其中一些我们有 5 秒的缓存时间(对于超级频繁请求的 API - 为我们节省了美元)

此外,这里还有一张图片,它还显示了同一时间段内的总调用次数和平均持续时间。很难知道什么是因果关系(由于节流而导致持续时间延长,反之亦然,因为某些 lambdas 确实调用了其他 lambdas)。请查看相应的轴,因为比例非常不同。

【问题讨论】:

  • 可以在此处找到有关每个指标的详细信息:docs.aws.amazon.com/lambda/latest/dg/…
  • 您的 Lambda 函数是否启用了重试选项?
  • 我认为 API Gateway 不会重试调用 Lambda,它只是向客户端返回一个错误代码。
  • 我的一个想法是,这可能只是 CloudWatch 可视化问题?如果并发计数在几秒钟内飙升至 2000,它将被限制,但可能不会持续足够长的时间来报告。
  • 我们仍然没有解决方案,但我们的下一个调查是 CloudWatch 可能在 Lambda 并发峰值方面误导了我们。试图从 AWS 支持中获得答案。

标签: amazon-web-services aws-lambda aws-api-gateway throttling


【解决方案1】:

这似乎很熟悉。我们遇到了完全相同的问题,我们感到困惑,因为我们的并发限制已经增加,但不幸的是,这并不是无服务器应用程序无限可扩展性的神奇修复。

我的猜测是您的 ENI(弹性网络接口)用完了,因为每个 lambda 函数在初始化之前都需要一个。默认限制为 350 个并发连接的 ENI。

您的 600 个并发 lambas 每分钟分组,所以我想它们中的几个在一分钟内重叠,因此超过 350 个。

要对此进行调查,请进入您的 API Gateway 的全局设置,并为其提供一个 IAM 角色 arn,该角色有权访问 CloudWatch 的 putlog。 然后进入单独的 API Gateway api 并启用详细日志记录。

API Gateway 尝试调用 lambda 函数时发生的任何错误都应显示在此处,而不是被忽略(默认情况下)。

如果错误看起来有点像:

{
    "Message": "Lambda was not able to create an ENI in the VPC of the Lambda function because the limit for Network Interfaces has been reached.",
    "Type": "User"
}

如果是这种情况,您需要请求增加 ENI 的限制。

【讨论】:

  • 感谢@Tom,我们将在本周进行调查,如果这是我们的问题,请告知您!
  • 我们开启了所有的日志记录,不幸的是,这与我们的 ENI 无关。日志中的消息包含“ConcurrentInvocationLimitExceeded”,所以肯定是 Lambda 节流。
  • 很高兴听到您离解决问题又近了一步,希望再次增加限制可以解决您的问题
【解决方案2】:

我认为这与 Lambda 并发突发限制有关。

基本上,您可以在突然负载下并发运行的 Lambda 函数实例的数量是有限制的,这个限制与每个区域的总体 Lambda 并发限制不同。

您可以在此处找到有关它的更多信息:

https://docs.aws.amazon.com/lambda/latest/dg/scaling.html

相关部分:

AWS Lambda 动态扩展函数执行以响应增加的流量,直至达到您的并发限制。在持续负载下,您的函数的并发量会激增到 500 到 3000 个并发执行之间的初始水平,每个区域会有所不同。在初始突增后,函数的容量每分钟增加 500 次并发执行,直到负载被容纳,或者该区域中所有函数的总并发量达到限制。

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2012-02-20
    • 2019-12-18
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多