我有一个Lambda函数,它从SQS队列中读取消息并将项目插入Dynamo。起初,我有512MB的内存。在云观察中,它报告使用的最大内存大约为58MB。我假设我可以将内存降低到128MB并且看到处理SQS消息的速率相同。然而,事实并非如此。事情明显放缓。谁能解释一下?
答案 0 :(得分:3)
这似乎违反直觉,但这是一个合乎逻辑的解释:
减少内存也会减少可用的CPU周期。您需要支付非常短期使用EC2实例的固定部分资源的费用,该实例具有固定的CPU与内存比率。
问:如何将计算资源分配给AWS Lambda函数?
在AWS Lambda资源模型中,您可以选择功能所需的内存量,并分配比例CPU功率和其他资源。例如,选择256MB内存为Lambda函数分配的CPU功率大约是请求128MB内存的两倍,CPU功率是选择512MB内存的一半。您可以将内存设置为64MB,从128MB增加到1.5GB。
那么,我们谈论的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的单线程异步操作。