【问题标题】:Why only 50 instances working on AWS lambda?为什么只有 50 个实例在 AWS lambda 上运行?
【发布时间】:2019-06-20 15:47:01
【问题描述】:

我正在使用context.logStreamName 来识别 lambda 实例。并发设置为无保留。但是日志显示只有 50 个实例在工作。

我是不是误解了 logStream(pre logStream pre instance)?我从this blog得到信息

下面是我对应的代码:

let instances = {};
for (let i = 0; i < each_invokes; i++) {
    lambda.invoke(params, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            // console.log(data);
            let logs = Buffer.from(data.LogResult, 'base64').toString('utf8');
            let instanceID = logs.match(new RegExp("\\$InstanceID: (.*?) \\$END", "ig"))[0].split(" ")[1];
            if (instanceID) {
                if (instances.hasOwnProperty(instanceID)) {
                    instances[instanceID] += 1
                } else {
                    instances[instanceID] = 0
                }
                console.log(instanceID, instances[instanceID], 'StatusCode:', data.StatusCode);
            } else {
                console.log('missing instanceID:', data.StatusCode)
            }
        }
        console.log(Object.keys(instances).length)
    });
}

我在我的 lambda 函数上console.log(context.logStreamName) 并使用RegExp 扭曲实例 ID。

尾日志一直显示如下输出:

b4afda96edf04e07ab819589d298521d 3 StatusCode: 200
50
a1ef1f4b518d47398daedda434ddd48c 3 StatusCode: 200
50
8dedc647796545ada94770895a8b190a 3 StatusCode: 200
50
7c4f48d72de0486e86e47c76ed3269ec 3 StatusCode: 200
50
2aa1f0dc9b0440fcac3d3127d123edb8 3 StatusCode: 200
50
3d1abeb38e7a45a4b933b669ad0c12d7 3 StatusCode: 200
50
531883ce26ac43b9bb0976726a2e5aa6 3 StatusCode: 200
50
cb9d0611a2e24244bd9ee98967a768c2 3 StatusCode: 200
50

这是否意味着,AWS lambda 只能运行 50 个实例?如果是,如何增加 AWS Lambda 中的并发计数?

【问题讨论】:

  • 我又看了你的代码。上面的代码好像不完整(需要lambdaeach_invokesparams)。上面的代码似乎是调用端代码。我们还需要 lambda 端代码。我们很乐意解决这个问题,请发布重现此问题所需的最少代码:stackoverflow.com/help/minimal-reproducible-example
  • @Taterhead lambdathis doc 声明的客户; each_invokes是并发请求次数,我设置为100;参数也可以通过前面提到的文档找到。
  • 嘿@Bruce,上面列出的代码是故事的一半。我们还需要查看为您的 Lambda 函数列出的代码。在 AWS 上运行的代码。我们只需要最少的代码,这样我们就可以在 50 时重现它。

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

除了 1000 次并发执行软限制之外,还有其他事情需要考虑。

如果您使用 lambda 函数来处理不基于轮询的事件,那么您可以在单个时刻运行的实际函数数量不是 1000。计算数量的公式是

invocations per second * average execution duration in seconds

这意味着如果您的函数执行平均需要 20 秒,那么您可以同时运行的该函数的实例数为 1000 / 20,即 50。

我并不是说您的代码就是这种情况,但在使用 lambda 限制时绝对需要考虑。

如果我们谈论的是基于轮询的函数(Lambda 与 Kinesis 流、DynamoDB 流集成),那么另一个起作用的是流中的分片数量。流中的每个分片一次最多可以由特定 lambda 函数的 1 个实例处理(请注意,不同的 lambda 函数可以同时处理同一个分片)。因此,如果您的流中有 50 个分片,那么您的 lambda 函数可以扩展到 50 个实例,但是上面提到的公式仍然成立,因此如果您的函数处理消息的时间超过 20 秒,那么并发执行的数量将为小于 50。

【讨论】:

    【解决方案2】:

    截至 2019 年 6 月,Lambda 并发执行数设置为 1000

    AWS 出于各种原因强加service limits on its resources。大多数限制都可以通过service limit increase on your console 提升或提高。

    Lambda has a special page 描述其限制并解释如何理解Lambda scales。只能增加concurrencyFunction and Layer Storage

    我们需要从您的问题中获得更多信息,以确定您被限制为 50 岁的原因。

    如果我猜的话,我认为您正在通过 GetMetricData 访问 CloudWatch Log,每秒 has a limit of 50

    【讨论】:

    • context.logStreamName 似乎与 CloudWatch 有关,但我没有使用 GetMetricData。我正在关注official docaws-sdk 访问尾日志
    • 嘿布鲁斯,您能否更新您的问题,详细说明您的 Lambda 是如何被调用或触发的?这可能会提供有关 50 限制的线索。谢谢!
    • 嗨@Taterhead。我的 lambda 函数就像example function。我会在我的问题上发布我的调用函数。现在我发现另一个问题,如果我将并发设置低于 100(例如 10),一旦我向 lambda 发送超过 10 个请求。它将抛出 TooManyRequestsException error。我不确定这是我帐户的默认限制还是我的错误。还在调查。谢谢!
    • 好的@Bruce,我有另一个建议:从你的函数中删除所有并发限制。然后参考这个页面:docs.aws.amazon.com/lambda/latest/dg/… - Cloudwatch 是 AWS 的官方日志服务,它会告诉你并发运行的 lambdas 的真实数量。我将尝试编写一个答案,向您展示如何记录正在运行的并发 lambda 的数量并在仪表板上查看真实数字。我的预感是,即使您的日志显示为 50,但您实际上正在运行 1000。请继续关注。
    【解决方案3】:

    我认为我得到 50 个实例日志的原因之一是上一个 lambda 函数进程的延迟时间和下一次冷启动时间之间的平衡。 Concurrency 的配置设置并没有告诉我它会立即冷启动 1000 个未预留的帐户并发。它确实收到了 1000 个请求,但一旦它立即释放下一个请求,因此无需冷启动另一个实例。但不知道是真是假。

    我可以确认的另一个原因是 AWS 的 default limit

    “AWS Lambda 的默认安全限制为每个区域每个账户 100 次并发执行。如果您希望提交请求以增加 100 次并发执行的限制,您可以访问我们的支持中心...”

    我没有找到官方文档,但手动找到了限制:

    当我将并发设置为 100 时,然后在本地机器上启动两个调用脚本,每个脚本同时发送 500 个调用。它将在队列中接收结果日志。日志上的实例数会逐渐增加到 100 个实例,而不是 50 个实例,这是一个调用脚本的结果。

    但是如果并发是 100 但我启动了三个调用脚本怎么办?它会启动 150 个实例吗?不,它会抛出TooManyRequestsException 错误。

    此测试不严格,仍在调查中。虽然生产上的问题并不严重,但我真的很想了解为什么会出现这个问题。

    --更新--

    问:我一次可以执行的 AWS Lambda 函数的数量是否有限制?

    没有。 AWS Lambda 旨在并行运行您的函数的多个实例。但是,AWS Lambda 的默认安全限制为每个区域每个账户 100 次并发执行。如果您希望提交增加 100 次并发执行限制的请求,您可以访问我们的支持中心,单击“打开新案例”,然后提交服务限制增加请求。

    问:如果我的帐户超过了并发执行的默认节流限制会怎样?

    超过限制限制时,同步调用的 AWS Lambda 函数将返回限制错误(429 错误代码)。异步调用的 Lambda 函数可以在大约 15-30 分钟内吸收合理的流量突发,之后传入事件将被拒绝,因为受到限制。如果调用 Lambda 函数以响应 Amazon S3 事件,则被 AWS Lambda 拒绝的事件可能会被 S3 保留并重试 24 小时。重试来自 Amazon Kinesis 流和 Amazon DynamoDB 流的事件,直到 Lambda 函数成功或数据过期。 Amazon Kinesis 和 Amazon DynamoDB Streams 将数据保留 24 小时。

    ---更新---

    正如我和 Matus Dubrava 所提到的,我管理我的 lambda 函数复杂性以监控函数的运行时间。指标如下所示:

    很明显,我们可以看到 Duration(300k Max) 和 ConcurrentExecutions 之间存在关系(我将最大并发设置为 100)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2020-06-24
      • 2016-03-04
      • 2020-09-29
      相关资源
      最近更新 更多