【问题标题】:Counting the number of concurrent Lambda function executions计算并发 Lambda 函数执行的数量
【发布时间】:2019-11-23 16:42:12
【问题描述】:

根据AWS documentation 所说,默认情况下,每个账户可以同时执行 1000 个并发 Lambda 函数。当然这是一个软限制,可以根据请求进行更改。

现在,我的问题是如何监控并发的 Lambda 函数执行?

我假设这应该(以某种方式)使用 CloudWatch 来完成。在 CloudWatch 的 Metrics 部分中,遵循以下路径:

All > Lambda > Across All Functions

您可以找到名称为 ConcurrentExecutions 的指标。我赌的是这个,但同时,我没有根据我所做的测试得到数字。在我们到达那里之前,图表上显示的该指标的值不是整数,所以我猜我在这里遗漏了一些东西。但这没关系。让我告诉你我进行的测试。

我在 EC2 实例上创建了一个简单的 NodeJs 脚本,如下所示:

const AWS = require('aws-sdk');
const https = require('https');

const sslAgent = new https.Agent({
    keepAlive: true,
    maxSockets: 200,
    rejectUnauthorized: true,
});
sslAgent.setMaxListeners(0);

AWS.config.update({
    region: 'us-east-1',
    httpOptions: {
        agent: sslAgent,
    },
});


const lambda = new AWS.Lambda();

function call() {
    return lambda.invoke({
        FunctionName: "test",
        Payload: JSON.stringify({
            wait: 5000,
        }),
    }).promise();
}

(async () => {
  let start = Date.now();
  const promises = [...Array(200).keys()].map(i => {
    return call(new Date(Date.now()).toISOString())
      .then(data => {
        console.log(`Success (${i})`);
      })
      .catch(err => {
        console.log(`Error (${i}): ${err}`);
      });
  });
  await Promise.all(promises);
  let end = Date.now();
  console.log((new Date(end - start).toISOString()).substr(11, 12));
})();

此脚本将调用 Lambda 函数(称为 test)200 次,无需等待各个调用返回。在服务器端,我在 Lambda 函数中有这段代码:

exports.handler = async (event, context, callback) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return new Promise((resolve) => {
        setTimeout(() => {
            callback(null, response);
            resolve();
        }, event.wait);
    });
};

此 Lambda 函数将使调用者在作为输入传递的时间(在本例中为 5 秒)内保持挂起状态。我运行了这个测试,并验证有 200 个 Lambda 函数实例同时运行。我通过访问 CloudWatch 并查看生成的日志来验证这一点,并且生成了 200 个日志流(每次执行都有一个单独的日志流)。

但是当我使用提到的指标时,图表仅显示 68.7,首先显示的是一个奇怪的数字,其次,它不是 200。那么这个数字是多少,我在哪里可以显示找到我的 200 个?

【问题讨论】:

  • 如果在一个时间段内聚合,它代表一个平均值。
  • 图表每 5 分钟显示一次样本。该样本不应该代表那 5 分钟内的执行总数吗?无论如何,我看不出我怎么能拿出 68.7! 200/5? 200/(5*60)?没有一个接近 68.7。
  • 顺便说一句,这个过程需要 6 秒才能完成。
  • 尝试使用“UnreservedConcurrentExections”指标。
  • 它们是相同的

标签: amazon-web-services aws-lambda amazon-cloudwatch


【解决方案1】:

通过询问 AWS 支持同样的问题,我得到了答案。在 CloudWatch 中,当您选择一个指标时,它看起来像这样:

以前,我完全错过了指标的统计列。显然,您在这里有不同的选择,帮助我找到并发执行次数的选择是Maximum

【讨论】:

  • 查看样本计数,这有点令人困惑,SampleCount 不应该只是 1 的 1 秒时间范围,并且发出的指标数据是 ConcurrentExecutions 的数量,所以这样 Min/Max/总和应该一样吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2016-02-07
  • 2020-04-26
  • 2019-06-20
  • 2015-07-19
  • 2021-07-15
  • 2017-10-22
相关资源
最近更新 更多