Amazon web services 计算并发Lambda函数执行的次数

Amazon web services 计算并发Lambda函数执行的次数,amazon-web-services,aws-lambda,amazon-cloudwatch,Amazon Web Services,Aws Lambda,Amazon Cloudwatch,根据所述,默认情况下,每个帐户一次可以执行1000个并发Lambda函数。这是一个软限制,可以根据请求进行更改 现在,我的问题是如何监控并发Lambda函数的执行 我认为这应该(以某种方式)使用CloudWatch来完成。在CloudWatch的Metrics部分中,遵循以下路径: All > Lambda > Across All Functions 您可以通过名称ConcurrentExecutions找到度量。我的赌注在这一点上,但同时,我没有得到基于我所做测试的数字。在我们

根据所述,默认情况下,每个帐户一次可以执行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秒)。我运行了这个测试,并验证了同时运行的Lambda函数有200个实例。我通过去CloudWatch查看生成的日志来验证这一点,生成了200个日志流(每个执行都有一个单独的日志流)


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

通过问AWS支持部门同样的问题,我得到了答案。在CloudWatch中,当您选择一个度量时,它将如下所示:

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));
})();


在此之前,我完全错过了一个指标的统计列。显然,这里有不同的选项,帮助我找到并发执行数的选项是最大值。通过问AWS支持部门同样的问题,我得到了答案。在CloudWatch中,当您选择一个度量时,它将如下所示:

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));
})();


在此之前,我完全错过了一个指标的统计列。显然,这里有不同的选项,帮助我找到并发执行数的选项是最大值

如果在一个时间段内进行聚合,它代表一个平均值。图表显示了每5分钟的一个样本。这个样本不应该代表这5分钟内执行的总数吗?无论如何,我不明白我怎么能想出68.7!200/5? 200/(5*60)? 没有一个接近68.7。顺便说一句,此过程需要6秒才能完成。请改为尝试“UnreservedConcurrentExecutions”度量。它们是相同的。如果在一个时间段内聚合,则表示平均值。图表显示每5分钟一个示例。这个样本不应该代表这5分钟内执行的总数吗?无论如何,我不明白我怎么能想出68.7!200/5? 200/(5*60)? 没有一个接近68.7。顺便说一句,此过程需要6秒才能完成。请尝试使用“UnreservedConcurrentExecutions”度量。它们在样本计数时是相同的,这有点令人困惑,SampleCount不应该在1秒的时间范围内仅为1,并且发出的度量数据是ConcurrentExecutions的数量,那么Min/Max/Sum应该是一样的吗?看看样本计数,它有点让人困惑,SampleCount不应该在1秒的时间范围内只有1,并且发出的度量数据是ConcurrentExecutions的数量,所以Min/Max/Sum应该是一样的吗?