【问题标题】:AWS Lambda function increasing Max Memory UsedAWS Lambda 函数增加 Max Memory Used
【发布时间】:2020-08-17 19:18:26
【问题描述】:

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

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

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

在执行一些操作后它会不断增加,从 217MB 到 218MB,之后到 219MB 等等。该函数多次运行,频率很高。

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

【问题讨论】:

  • 你的程序的内存占用是否随时间增加主要取决于应用程序代码;尽管底层运行时也可能随时间变化并导致内存占用发生一些变化,但 AWS 不会经常更改它,所以我认为这不是你的问题。查看我在 prod 中使用的一个简单 lambda,自从代码停止更改以来,内存使用量一直保持不变。我会查看您的代码,以查找内存占用量可能随时间增长的地方 - 或者更有可能随着数据增长。您是在处理时删除 SQS 消息,还是在每次迭代时从旧执行中选择数据?
  • 这是一个非常小的样本量,217/218/219 的值都大致相同。是否严格增加超过 100 次迭代?
  • @jarmod 是的,我在日志中查看了更多内容,并且还在不断增加。
  • @DanielFarrell 是的,我正在删除这些消息。而且我没有从旧的执行中选择数据。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 记住内存设置也控制着cpu和网络。
  • 我将更详细地查看代码,因为我制作的其他函数没有这个问题。感谢@Matthew 的回答。
  • 分配更少的内存会强制 GC 更积极地发生吗?
  • @trademark 有很多 GC 配置选项,我认为内存压力是用于确定 GC 是否运行的指标之一,这可能吗?
【解决方案2】:

今天我正在尝试为 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

您可以设置比 ma​​xMemoryUsedMB 大一点的值。

它从 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2019-07-16
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多