Node.js内存消耗OS X与Linux



我在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兆字节的数据:

$ cat 500mb.txt | nc localhost 3000

现在它变得有趣了。我正在使用top观察node进程,并且我在OSX和Linux上执行此操作。

当我启动Node.js…时

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

第一个问题:这两个值是可比的,还是我在这里遗漏了什么?

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

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

这是怎么回事?为什么Node.js在Linux上比在OSX上使用的内存多得多?我的设置有错吗?我是不是错过了什么。。。?

顶部的RES值可以在具有process.memoryUsage()的Node内部检索,然后在rss中。找到此GitHub回购https://github.com/baryshev/rss-memory-leak以及相应的Node问题https://github.com/joyent/node/issues/4217.

Linux和Mac OS X的内存管理器是复杂的野兽,计算进程的内存使用情况是一门黑艺术

在Linux上,RSS大小是驻留的进程大小。它包括映射的二进制文件和库以及匿名映射的页面(malloc数据),但不包括未映射的数据,例如当前未映射的二进制部分、已映射的匿名页面或延迟分配的匿名页面。当内存充足时,即使您的应用程序没有做太多工作,它也会增长;如果由于不同的进程而造成内存压力,它会收缩。从程序员的角度来看,这是非常无用的(但从系统管理员的角度来看非常有用)。

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

总之,只要应用程序运行良好,所显示的不同值可能就不需要担心。虽然查看操作系统提供的值可以粗略判断是否有什么问题,但查看V8的堆分析器提供的值可能会更好。

您可能正在经历Mavericks内存压缩。(见本页最后一点)

从本质上讲,Mac OSX会压缩它认为"非活动"的页面以节省空间。操作系统用来确定"不活跃"的算法可能是秘密的(尽管我无法证明这一点)。小牛队使用的压缩算法是WKdm

如果确实是这样的话,OSX可能会决定v8拥有的某些页面已经有一段时间没有使用了,并对它们进行压缩,为其他程序腾出空间。即使您有空闲内存,OSX也会这样做,因为它使用未明确使用的内存作为将来可能使用的程序代码和数据的缓存(这些内存也被压缩)。

我也不认为这不是人们不可避免地会提到的其他事情的专属;分配器和GC、v8怪癖等方面的差异也很重要,但这当然也很重要。

最新更新