Seb*_*rth 5 linux virtual-memory node.js
我正在运行一个 5k loc Express 应用程序,其中包含许多其他依赖项,包括 Express。该应用程序称它需要大约 60 MB RAM RSS。但是,当查看我的 Linux 机器上的实际 RAM 使用情况时,top我发现它使用了约 1200 MB VIRT 内存,而仅占用了约 60 MB RES (RSS) 内存。
然后我编写了一个简单的test.js脚本来隔离案例:
setInterval(() => {
console.log(JSON.stringify(process.memoryUsage()));
} , 1000);
Run Code Online (Sandbox Code Playgroud)
并开始使用:node test.js
它告诉我它使用了大约 30 MB RAM:
{"rss":30097408,"heapTotal":6537216,"heapUsed":3829224,"external":8272}
Run Code Online (Sandbox Code Playgroud)
再次查看top命令中的内存,它显示 RES 为 30 MB,但 VIRT 使用量约为 470 MB。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8498 ted 20 0 485948 29928 23540 S 0,3 0,8 0:00.44 node
Run Code Online (Sandbox Code Playgroud)
NodeJS 这样看起来并不轻量。
我的 NodeJS 应用程序(不是测试应用程序)的托管程序为我的应用程序永久授予了大约 600 MB 的内存,但由于内存使用率过高,几秒钟后就终止了我的节点进程。高虚拟内存使用率(提到的 1200/3800 MB)被视为触发因素。所以我的问题是:
与实际需要的内存相比,为什么应用程序的虚拟内存使用量如此之高?内存被占用是做什么用的?
我可以限制 NodeJS 的虚拟内存吗(它是否被使用?)?
我遇到了类似的问题,尤其是在 Azure 集群中的 pod 中。他们的 RSS 比本地机器高得多。我们基本上减慢了一些查询(流、缓冲区),以便让节点垃圾收集有机会赶上。这是迄今为止唯一有效的方法,并将内存使用量减少了 8 倍(峰值减少了 3 倍)。
许多事件侦听器可能会同时打开太多函数,或者只是不给 Node GC 时间。
Node 上的 GC 通常很好,但它也有问题,特别是在初始化等非常高的负载期间。