AWS Lambda和不准确的内存分配

时间:2016-02-09 17:42:24

标签: amazon-web-services aws-lambda

我意识到我需要为AWS Lambda函数分配比需要更多的内存,否则我得到:

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" class="form-inline" id="usrform" method="POST">
    <textarea style="color: #3f3f3f; width: 40%;" rows="10" name="emailtxt" placeholder="Email Text" autocomplete="off" spellcheck="false" form="usrform"></textarea>
    <input type="submit" class="btn btn-primary" value="Send"/>
</form>

例如,我有一个分配了128MB的Lambda函数,它会随着该错误一直崩溃,而在控制台中它会显示“最大内存使用56 MB”。
然后我分配256MB,它不再崩溃,但它总是给我一个75到85MB之间的“最大内存使用”。

为什么?感谢。

2 个答案:

答案 0 :(得分:10)

分配给java lambda函数的内存量由堆,元和保留代码内存共享。

容器为分配256M的函数执行的java命令类似于:

java -XX:MaxHeapSize=222823k -XX:MaxMetaspaceSize=26214k -XX:ReservedCodeCacheSize=13107k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation -jar /var/runtime/lib/LambdaJavaRTEntry-1.0.jar

222823k + 26214k + 13107k = 256M

容器为分配了384M的函数执行的java命令类似于

java -XX:MaxHeapSize=334233k -XX:MaxMetaspaceSize=39322k -XX:ReservedCodeCacheSize=39322k -XX:+UseSerialGC -Xshare:on -XX:-TieredCompilation -jar /var/runtime/lib/LambdaJavaRTEntry-1.0.jar

334233k + 39322k + 39322k = 384M

所以,公式似乎是

85%堆+ 10%meta + 5%保留代码缓存= 100%已配置的功能内存

老实说,我不知道&#34; Max Memory的使用情况&#34;计算Cloudwatch日志中报告的值。它与我所看到的任何东西都没有对齐。

答案 1 :(得分:3)

这里发生的事情可能是两件事之一:

  1. 该函数无法保留额外的内存并失败,导致您看到的错误,并保持内存不足,因为更多的请求导致JVM崩溃。
  2. 你只耗尽了Metaspace,@ jstell指出它只占总内存的10%,而你只使用56MB的堆空间。
  3. 当你占用更大的内存空间时,它会增加你的元空间分配,从而使函数能够运行。