1

我在 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...</p>

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

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

然后,一旦我运行cat ... | nc ...,内存使用量就会增加。一通电话后……</p>

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

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

4

3 回答 3

1

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

于 2014-10-25T08:55:30.030 回答
1

Linux 和 Mac OS X 的内存管理器是复杂的野兽,计算一个进程的内存使用是一门黑魔法。

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

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

总之,只要您的应用程序运行良好,所显示的不同值可能无需担心。虽然查看操作系统提供的值可能有助于粗略了解是否有任何问题,但通过查看 V8 的堆分析器提供的值可能会更好地为您服务。

于 2014-10-27T13:27:21.050 回答
0

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

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

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

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

于 2014-10-26T00:12:42.587 回答