我有一个内置于.NET Core 2.1中的AWS Lambda函数。这是由SQS队列触发的。
此功能的最大内存为512MB,超时时间为2分钟。
查看CloudWatch日志,我发现执行了一定次数后,已使用的最大内存有所增加。请参见以下图片:
它在执行某些命令后一直在增加,从217MB增加到218MB,再增加到219MB,依此类推。此功能多次运行并且频率很高。
有人在AWS Lambda上遇到过这个问题吗?预先感谢您的帮助。
答案 0 :(得分:3)
这是假设您的代码中没有错误,并且您正在处理相同数量的工作...
AWS Lambda使您的应用程序代码实例运行一段时间,以确保对它的后续请求快速进行,因此这可能只是因为未在运行代码的进程上运行垃圾回收。
相反,我更担心的是在您的应用程序甚至没有使用256MB时支付512MB。请记住,您不用为使用的东西付费,而是为分配的东西付费。
编辑: 根据{{3}}的评论,请记住,更改内存分配将影响您的CPU和网络共享。
答案 1 :(得分:0)
今天,我正在尝试优化Lambda函数的内存并阅读这篇文章,因此分享一些有关内存的想法,可能会对其他人有所帮助。
最好首先在log insight下运行以下查询以查看内存统计信息,即memory used
和total 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)
如您所见,由于请求花费了更多时间,内存发生了变化
filter @type = "REPORT"
| fields @requestId, @billedDuration, @maxMemoryUsed/1024/1024
| sort by @billedDuration desc