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

问题描述 投票:1回答:2

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

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

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

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

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

amazon-web-services aws-lambda serverless
2个回答
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内核= 2/3的CPU。细节可能会在未来重新审视

Lambda Function Configuration文档支持该解释,该文档指出:

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

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


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分数不固定,但取决于某些其他因素。

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

© www.soinside.com 2019 - 2024. All rights reserved.