我在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 ...
时MEM 5152K
(看起来不错)RES 15180
(我将其解释为 15 MB ,但我对此并不确定。)第一个问题:这两个值是否具有可比性,或者我在这里遗漏了什么?
然后,只要我运行cat ... | nc ...
,内存使用量就会增加。一个电话后......
MEM 20M
RES 92320
(这意味着92(!)MB内存使用量)这里发生了什么?为什么Node.js在Linux上使用的内存比在OS X上多得多?我的设置错了吗?我错过了什么吗? ...?
答案 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怪癖等的差异也很重要,但这也很重要。