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

Tia*_*ila 3 c# amazon-web-services .net-core aws-lambda

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

该函数的最大内存为 512MB,超时为 2 分钟。

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

在此输入图像描述 在此输入图像描述

经过一些执行后,它不断增加,从 217MB 到 218MB,再到 219MB,依此类推。该函数运行多次且频率很高。

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

Adi*_*iii 6

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

首先最好使用日志洞察运行下面的查询来查看内存统计信息(即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
Run Code Online (Sandbox Code Playgroud)

输出

Field   Value
avgMemoryUsedMB 
449.654
maxMemoryUsedMB 
616.0736
overProvisionedMB   
909.8053
provisonedMemoryMB  
1525.8789
smallestMemoryRequestMB 
324.2493
Run Code Online (Sandbox Code Playgroud)

您可以设置比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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,内存随着花费更多时间的请求而变化

在此输入图像描述 或者

filter @type = "REPORT"
| fields @requestId, @billedDuration, @maxMemoryUsed/1024/1024
| sort by @billedDuration desc
Run Code Online (Sandbox Code Playgroud)


Mat*_*hew 5

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

AWS Lambda 使您的应用程序代码实例保持运行一段时间,以确保对其进行后续请求的速度很快,因此这可能只是运行您的代码的进程上尚未运行垃圾收集的问题。

相反,我更关心的是,当您的应用程序甚至没有使用 256MB 时,还要支付 512MB 的费用。请记住,您不必为使用的内容付费,而是为分配的内容付费。

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

  • 请记住,内存设置还控制 cpu 和网络。 (2认同)