AWS Lambda(特别是 Node.js 运行时)使用什么指标来确定使用的最大内存?

DR.*_*DR. 3 amazon-web-services node.js aws-lambda

我想确定当我的函数执行时数组在内存中的大小。确定数组的大小很容易,但我没有看到数组大小与 Lambda 执行结束时记录的最大使用内存之间的相关性。

process.memoryUsage()检查设置阵列前后以及 Lambda 报告的最大内存使用情况后,没有发现明显的着色。我找不到一个好的资源来指示 Lambda 实际如何/使用什么来确定所使用的内存。任何帮助,将不胜感激?

Dan*_*one 6

这个问题让我自己很好奇,所以我决定运行一些测试来看看 AWS Lambda 容器内的内存分配是如何工作的。

测试 1:在内存中创建包含 100,000 个元素的数组

内存大小:128MB

exports.handler = async (event) => {
    const arr = [];
    for (let i = 0; i < 100000; i++) {
        arr.push(i);
    }
    console.log(process.memoryUsage());
    return 'done';
};
Run Code Online (Sandbox Code Playgroud)

结果:56 MB

2019-04-30T01:00:59.577Z    cd473d5b-986c-436e-8b36-b114410c84cf    { rss: 35299328,
  heapTotal: 11853824,
  heapUsed: 7590320,
  external: 8224 }
REPORT RequestId: 2a7548f9-5d2f-4060-8f9e-deb228730d8c  Duration: 155.74 ms Billed Duration: 200 ms     Memory Size: 128 MB Max Memory Used: 56 MB  
Run Code Online (Sandbox Code Playgroud)

测试 2:在内存中创建包含 1,000,000 个元素的数组

内存大小:128MB

2019-04-30T01:00:59.577Z    cd473d5b-986c-436e-8b36-b114410c84cf    { rss: 35299328,
  heapTotal: 11853824,
  heapUsed: 7590320,
  external: 8224 }
REPORT RequestId: 2a7548f9-5d2f-4060-8f9e-deb228730d8c  Duration: 155.74 ms Billed Duration: 200 ms     Memory Size: 128 MB Max Memory Used: 56 MB  
Run Code Online (Sandbox Code Playgroud)

结果:99 MB

2019-04-30T01:03:44.582Z    547a9de8-35f7-48e2-a53f-ab669b188f9a    { rss: 80093184,
  heapTotal: 55263232,
  heapUsed: 52951088,
  external: 8224 }
REPORT RequestId: 547a9de8-35f7-48e2-a53f-ab669b188f9a  Duration: 801.68 ms Billed Duration: 900 ms     Memory Size: 128 MB Max Memory Used: 99 MB  
Run Code Online (Sandbox Code Playgroud)

测试 3:在内存中创建包含 10,000,000 个元素的数组

内存大小:128MB

exports.handler = async (event) => {
    const arr = [];
    for (let i = 0; i < 1000000; i++) {
        arr.push(i);
    }
    console.log(process.memoryUsage());
    return 'done';
};
Run Code Online (Sandbox Code Playgroud)

结果:128 MB

REPORT RequestId: f1df4f39-e0fc-4b44-8f90-c3c0e3d9c12d  Duration: 3001.33 ms    Billed Duration: 3000 ms    Memory Size: 128 MB Max Memory Used: 128 MB 
2019-04-30T00:54:32.970Z f1df4f39-e0fc-4b44-8f90-c3c0e3d9c12d Task timed out after 3.00 seconds
Run Code Online (Sandbox Code Playgroud)

我认为我们可以非常自信地说 lambda 容器使用的内存确实会根据内存中数组的大小而增加;在我们的第三次测试中,我们最终耗尽了内存并超时。我在这里的假设是,控制 lambda 执行的进程也会监视该执行获取了多少内存;很可能正如cat /proc/meminfo特洛南德斯所暗示的那样。