Node.js内存消耗OS X vs Linux

时间:2014-10-15 08:09:24

标签: linux node.js macos memory-consumption

我在Node.js中编写了一个超级简单的TCP / IP套接字服务器:

'use strict';

var net = require('net');

net.createServer(function (socket) {
  socket.resume();
  socket.once('end', function () {
    socket.removeAllListeners();
  });
}).listen(3000);

once('end', ...甚至不需要,但我想确定。然后我从终端运行以下命令,将500 MB的数据发送到服务器:

$ cat 500mb.txt | nc localhost 3000

现在它变得有趣了。我正在使用node查看top进程,我在OS X和Linux上执行此操作。

当我启动Node.js ...

  • OS X报告MEM 5152K(看起来不错)
  • Linux报告RES 15180(我将其解释为 15 MB ,但我对此并不确定。)

第一个问题:这两个值是否具有可比性,或者我在这里遗漏了什么?

然后,只要我运行cat ... | nc ...,内存使用量就会增加。一个电话后......

  • OS X报告MEM 20M
  • Linux报告RES 92320(这意味着92(!)MB内存使用量)

这里发生了什么?为什么Node.js在Linux上使用的内存比在OS X上多得多?我的设置错了吗?我错过了什么吗? ...?

3 个答案:

答案 0 :(得分:1)

顶部的 RES 值可以在process.memoryUsage()的节点内检索,然后在 rss 值中。找到了这个GitHub repo https://github.com/baryshev/rss-memory-leak和相应的Node问题https://github.com/joyent/node/issues/4217

答案 1 :(得分:1)

Linux和Mac OS X的内存管理器是复杂的野兽,并且计算进程的内存使用是一种黑色艺术。

在Linux上,RSS大小是驻留进程大小。它包括映射二进制文件和库以及匿名映射页面(malloc数据)之类的内容,但不包括未映射数据,例如当前未映射的二进制文件部分,已映射出的匿名页面或延迟分配匿名页面。即使你的应用程序没有做太多的事情,当它有足够的内存时它会增长,并且如果由于不同的进程而导致内存压力会缩小。从程序员的角度来看,它几乎没用(但从系统管理员的角度来看非常有用)。

在Mac OS X上,MEM列记录为"内存大小"。如果不检查top和内核的来源,就不可能知道它的确切反映。

总之,只要应用程序运行正常,显示的不同值可能无需担心。虽然查看操作系统提供的值对于是否有任何错误可能是有用的,但通过查看V8的堆分析器提供的值,您可能会更好地服务。

答案 2 :(得分:0)

您可能正在体验Mavericks Memory Compression。 (见this page上的最后一点)

从本质上讲,Mac OSX将压缩它认为“无效”的页面以节省空间。操作系统用来确定“非活动”的算法可能是秘密的(虽然我不能证明它是)。 Mavericks使用的压缩算法是WKdm

如果确实如此,OSX可能会决定某些页面v8拥有的页面暂时没有使用,并压缩它们以便为其他程序腾出空间。即使你有空闲内存,OSX也会这样做,因为它使用的内存没有明确地用作程序代码的缓存,以及你将来可能使用的数据(也是压缩的)。 / p>

我也不会认为这不是人们不可避免地会提出的其他事情所独有的;分配器和GC,v8怪癖等的差异也很重要,但这也很重要。