AWS Lambda函数增加使用的最大内存

时间:2019-03-22 13:18:26

标签: c# amazon-web-services .net-core aws-lambda

我有一个内置于.NET Core 2.1中的AWS Lambda函数。这是由SQS队列触发的。

此功能的最大内存为512MB,超时时间为2分钟。

查看CloudWatch日志,我发现执行了一定次数后,已使用的最大内存有所增加。请参见以下图片:

enter image description here enter image description here

它在执行某些命令后一直在增加,从217MB增加到218MB,再增加到219MB,依此类推。此功能多次运行并且频率很高。

有人在AWS Lambda上遇到过这个问题吗?预先感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这是假设您的代码中没有错误,并且您正在处理相同数量的工作...

AWS Lambda使您的应用程序代码实例运行一段时间,以确保对它的后续请求快速进行,因此这可能只是因为未在运行代码的进程上运行垃圾回收。

相反,我更担心的是在您的应用程序甚至没有使用256MB时支付512MB。请记住,您不用为使用的东西付费,而是为分配的东西付费。

编辑: 根据{{​​3}}的评论,请记住,更改内存分配将影响您的CPU和网络共享。

答案 1 :(得分:0)

今天,我正在尝试优化Lambda函数的内存并阅读这篇文章,因此分享一些有关内存的想法,可能会对其他人有所帮助。

最好首先在log insight下运行以下查询以查看内存统计信息,即memory usedtotal allocated内存,并根据使用情况从日志中将内存分配给Lambda函数没有正确优化内存,这意味着250MB内存或50%的内存已超额配置,您需要为此付费而无需使用

在查询下面运行以查找预留空间。

filter @type = "REPORT"
| stats max(@memorySize / 1024 / 1024) as provisonedMemoryMB,
  min(@maxMemoryUsed / 1024 / 1024) as smallestMemoryRequestMB,
  avg(@maxMemoryUsed / 1024 / 1024) as avgMemoryUsedMB,
  max(@maxMemoryUsed / 1024 / 1024) as maxMemoryUsedMB,
  provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB

输出

Field   Value
avgMemoryUsedMB 
449.654
maxMemoryUsedMB 
616.0736
overProvisionedMB   
909.8053
provisonedMemoryMB  
1525.8789
smallestMemoryRequestMB 
324.2493

您可以设置比 maxMemoryUsedMB 大一些的东西。

它从217MB增加到218MB,之后又增加到219MB,依此类推。该功能多次运行且频率很高

您显示的统计数据非常少,这只是几个请求,还有@Matthew提到的一个原因,这也是可以预期的,因为并非每个SQS消息都相同,而且lambda的目的地也不同,例如,将消息发送到RDS等,因此处理和使用SQS以及与您Lambda中的资源进行交互可能会增加或减少内存。

此外,持续时间可能会影响内存,因此请运行查询以查找昂贵的请求。

filter @type = "REPORT"
| stats avg(@duration), max(@duration), min(@duration),max(@memorySize / 1024 / 1024) by bin(5m)

如您所见,由于请求花费了更多时间,内存发生了变化

enter image description here

filter @type = "REPORT"
| fields @requestId, @billedDuration, @maxMemoryUsed/1024/1024
| sort by @billedDuration desc