AWS Lambda功能需要超过CloudWatch中报告的最大内存

时间:2017-05-15 00:58:15

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

我有一个Lambda函数,它从SQS队列中读取消息并将项目插入Dynamo。起初,我有512MB的内存。在云观察中,它报告使用的最大内存大约为58MB。我假设我可以将内存降低到128MB并且看到处理SQS消息的速率相同。然而,事实并非如此。事情明显放缓。谁能解释一下?

这是云表,显示512MB Lambda的最大内存: enter image description here

这是云表,显示128MB Lambda的最大内存: enter image description here

在这里,您可以看到Dynamo表的容量确实下降了 enter image description here

在这里,您可以看到正在处理的消息数量确实减慢了,这是较低斜率的证据 enter image description here

1 个答案:

答案 0 :(得分:3)

这似乎违反直觉,但这是一个合乎逻辑的解释:

减少内存也会减少可用的CPU周期。您需要支付非常短期使用EC2实例的固定部分资源的费用,该实例具有固定的CPU与内存比率。

  

问:如何将计算资源分配给AWS Lambda函数?

     

在AWS Lambda资源模型中,您可以选择功能所需的内存量,并分配比例CPU功率和其他资源。例如,选择256MB内存为Lambda函数分配的CPU功率大约是请求128MB内存的两倍,CPU功率是选择512MB内存的一半。您可以将内存设置为64MB,从128MB增加到1.5GB。

     

https://aws.amazon.com/lambda/faqs/

那么,我们谈论的CPU容量是多少?

  

AWS Lambda使用与通用Amazon EC2实例类型(例如M3类型)相同的比率来分配与内存成比例的CPU功率。

     

http://docs.aws.amazon.com/lambda/latest/dg/lambda-introduction-function.html

我们可以推断。

在M3类中,无论实例大小如何,配置因子如下所示:

CPU = Xeon E5-2670 v2 (Ivy Bridge) × 8 cores
Relative Compute Performance = 26 ECU
Memory = 30 GiB

ECU是EC2(或可能是" Elastic"或"等效")计算单元,其中1.0 ECU大约相当于1GHz Opteron的计算容量。它是一个无量纲的数量,用于简化不同实例类型的相对CPU容量的比较。

所以配置比例如下:

8/30 Cores/GiB
26/30 ECU/GiB

所以在512 MiB内存中,你的Lambda函数容器在这台机器上的份额将是......

8 ÷ 30 ÷ (1024/512) = 0.133 of 1 core (~13.3% CPU)
26 ÷ 30 ÷ (1024/512) = 0.433 ECU (~433 MHz equivalent)

在128 MiB,它只有1/4左右。

这些数字看起来很小,但它们并不适合典型的Lambda用例 - 不带CPU的单线程异步操作。