1

我告诉一个朋友,使用 lambda 函数运行负载的一个优点是每个实例,因此每次执行,都会获得专用资源 - 内存和 CPU(也许还有磁盘、网络,......但这不太相关)。然后我开始怀疑...

例如,如果您有一个函数具有一些由多个租户使用的 CPU 密集型逻辑,那么一个执行永远不会受到另一个执行的影响。如果某个计算需要 5 秒来执行,那么无论同时处理多少个请求,它总是需要 5 秒。

这对于内存来说似乎是不言而喻的,但对于 CPU 来说则不然。通过快速测试,我似乎得到了喜忧参半的结果。

那么,每个函数实例都有自己的 CPU 专用资源吗?

我的主要关注点是 AWS Lambda,但同样的问题出现在 Azure(我猜是在消费计划上)和谷歌。

4

2 回答 2

2

Lambda 使用实例 CPU 的部分 CPU 分配,在与计算优化 EC2 实例相当的实例类型上运行。该 CPU 份额专用于 Lambda,其分配基于分配给函数的内存量

专用于某个功能的 CPU 份额取决于每个两个内核分配的内存的比例。例如,一个具有约 3 GB 内存的实例可用于 lambda 函数,其中每个函数最多可拥有 1 GB 内存,这意味着您最多可以使用约 1/3 * 2 个内核 = 2/3 的 CPU。未来可能会重新审视细节

Lambda 函数配置文档支持该解释,该文档指出:

对您的 Lambda 函数进行性能测试是确保您选择最佳内存大小配置的关键部分。内存大小的任何增加都会触发函数可用 CPU 的等效增加。

所以是的,根据您的内存分配和上面的公式,您可以获得实例总 CPU 的专用份额。

于 2017-12-29T15:33:07.917 回答
1

可能已经更清楚地表明我不是在寻找文档,而是在寻找事实。核心问题是我们是否可以假设一个执行永远不会受到另一个执行的影响

正如我所说,第一次快速测试给了我不同的结果,所以我花时间深入研究。我创建了一个非常简单的 lambda,它在指定的秒数内生成并汇总随机数(此处的代码):

while (process.hrtime(start)[0] < duration) {
  var nextRandom = randomizer();
  random = random + nextRandom - 0.5;
  rounds++;
}

现在,如果不同实例上的执行确实是独立的,那么在所有其他因素都相同的情况下,仅并行执行一次或多次执行这个 lambda 应该没有区别。

但数字表明并非如此。这是一个图表,显示了每秒达到的“回合”数。

每秒“回合”,128MB lambda

每个数据点都是具有相同数量并行请求的 10 次迭代的平均值——这应该排除冷启动效应和其他变化。原始结果可以在这里找到。

结果看起来相当令人震惊:它们表明避免并行执行相同的 lambda 几乎可以使性能翻倍......?!

但坚持最初的问题:这看起来像“专用”给 lambda 实例的 CPU 部分不是固定的,而是取决于某些其他因素。

当然,我欢迎对测试发表任何评论,当然也欢迎对观察到的行为进行解释!

于 2018-01-02T21:27:02.517 回答