为什么只有50个实例在AWS Lambda上运行?

时间:2019-06-12 07:48:08

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

我正在使用context.logStreamName来标识lambda实例。并发设置为未保留。但是它的日志显示只有50个实例正在运行。

我误解了logStream(在logStream实例之前)吗?我从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)
    });
}

console.log(context.logStreamName)在我的lambda函数上,并使用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中的并发计数?

3 个答案:

答案 0 :(得分:2)

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

如果您使用lambda函数处理非基于轮询的事件,那么您一次可以运行的实际函数数量不是1000。计算数量的公式为

invocations per second * average execution duration in seconds

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

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

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

答案 1 :(得分:1)

自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日志,每秒has a limit of 50

答案 2 :(得分:1)

我认为获得50个实例日志的原因之一是上一个lambda函数处理的延迟时间与下一次冷启动的时间之间的平衡。并发的配置设置没有告诉我它将立即冷启动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分钟的合理流量,此后传入事件将被抑制。如果要响应Amazon S3事件而调用Lambda函数,则AWS Lambda拒绝的事件可能会保留并由S3重试24小时。重试来自Amazon Kinesis流和Amazon DynamoDB流的事件,直到Lambda函数成功或数据到期为止。 Amazon Kinesis和Amazon DynamoDB流将数据保留24小时。

---更新---

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

很明显,我们看到Duration(持续时间(最大值为300k))与ConcurrentExecutions(我将最大并发次数设置为100)之间存在关系。

pic