消耗所有可用内存的节点脚本

Node Script to consume all available memory

为了对我正在构建的项目进行压力测试,我需要编写一个 Node 脚本来尝试消耗机器上所有可用的 RAM - 允许我测试我是否有适当的机制来检测和终止这样的 运行 离开进程有效。

我写了这个脚本:

let buffer = [];

const MB = (bytes) => Math.round(bytes/1024/1024) + 'MB'

const memoryUsage = () => {
        const mem = process.memoryUsage();
        return MB(mem.rss) + '\t' + MB(mem.heapTotal) + '\t' + MB(mem.external);
}


setInterval(()=>{
    buffer.push(Buffer.alloc(1024 * 1024* 1024)); // Eat 1GB of RAM every second
    console.log(buffer.length + '\t' + memoryUsage());
}, 1000);

每秒尝试分配 1 GB 或 RAM。

200 秒后,这是我的控制台输出:

196 28MB    7MB 200704MB
197 28MB    7MB 201728MB
198 28MB    7MB 202752MB
199 28MB    7MB 203776MB
200 28MB    7MB 204800MB
201 28MB    7MB 205824MB
202 28MB    7MB 206848MB
203 28MB    7MB 207872MB
204 28MB    7MB 208896MB
205 28MB    7MB 209920MB

这是 htop 中的 RAM 使用情况:

RAM usage

我的问题是:

  1. 如果虚拟内存不在 RAM 或 Swap 中,它位于何处?脚本如何在不实际分配任何东西的情况下分配 245GB 的 Virt 内存?
  2. 我如何使脚本运行,并实际分配 RAM 以使机器停机?即,如何增加 HTOP 的 RES 列中的数字?
  3. 我的意图是 运行 由用户编写和上传的不受信任的任意脚本 - 运行在这种情况下,离开 RAM 使用情况是否是要检查的现实场景?

这是官方 Nodejs 8 Docker 容器中的 运行ning。

使用内存。即使您认为您已经分配了它,但在您使用它之前可能并非如此。用零、随机数或其他内容填充它。如果你不使用内存,聪明的编译器或解释器总是有跳过分配的风险。