我告诉朋友,使用lambda函数运行负载的一个好处是,每个实例,以及每次执行,都会获得专用资源 - 内存和CPU(可能还有磁盘,网络......)但相关性较低)。然后我开始怀疑......
例如,如果您的某个功能具有多个租户使用的CPU密集型逻辑,那么一个执行应该永远不会受到另一个执行的影响。如果某些计算需要5秒钟才能执行,无论同时处理多少请求,总是需要5秒钟。
这对于内存来说似乎是不言而喻的,但对于CPU则不那么明显。从快速测试来看,我似乎得到了不同的结果。
那么,每个函数实例都有自己的CPU专用资源吗?
我的主要关注点是AWS Lambda,但同样的问题出现在Azure(我认为是消费计划)和Google上。
答案 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只需要一次或多次并行,所有其他因素都是相同的。
但数字显示不然。这是一张图表,显示了每秒实现的“回合数”。
每个数据点是具有相同并行请求数的10次迭代的平均值 - 这应该排除冷启动效应和其他变化。可以找到原始结果here。
结果看起来相当令人震惊:它们表明避免同一个lambda的并行执行几乎可以使性能提高一倍......?!
但坚持原来的问题:这看起来像'专用'lambda实例的CPU分数不固定,但取决于某些其他因素。
当然,我欢迎任何关于测试的评论,当然还有对观察到的行为的解释!