无服务器功能是否获得专用CPU资源?

时间:2017-12-29 12:53:56

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

我告诉朋友,使用lambda函数运行负载的一个好处是,每个实例,以及每次执行,都会获得专用资源 - 内存和CPU(可能还有磁盘,网络......)但相关性较低)。然后我开始怀疑......

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

这对于内存来说似乎是不言而喻的,但对于CPU则不那么明显。从快速测试来看,我似乎得到了不同的结果。

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

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

2 个答案:

答案 0 :(得分:2)

Lambda使用实例CPU的小数CPU分配,在与compute optimized EC2 instance相当的实例类型上运行。该CPU份额专用于Lambda,其分配基于amount of memory allocated to the function

  

专用于函数的CPU份额基于分数   每个核心分配的内存。例如,一个   具有~3 GB内存的实例可用于lambda函数,其中每个都有   功能最多可以有1 GB内存,最多可以使用〜   1/3 * 2核心= CPU的2/3。细节可能会重新审视   将来

Lambda Function Configuration文档支持该解释,其中说明:

  

性能测试您的Lambda功能是确保的关键部分   你选择了最佳的内存大小配置。 内存增加   size会触发相应的CPU可用量增加   功能

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

答案 1 :(得分:1)

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

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

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

现在,如果不同实例上的执行真的是独立的,那么执行这个lambda只需要一次或多次并行,所有其他因素都是相同的。

但数字显示不然。这是一张图表,显示了每秒实现的“回合数”。

'Rounds' per second with 128MB lambda

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

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

但坚持原来的问题:这看起来像'专用'lambda实例的CPU分数不固定,但取决于某些其他因素。

当然,我欢迎任何关于测试的评论,当然还有对观察到的行为的解释!