node.js集群可以在64位Wintel PC上产生多少子进程?

时间:2012-02-14 10:56:26

标签: windows node.js concurrency 64-bit process

我正在运行并发测试,为了简洁起见,为每个欺骗性的http请求定义了一个进程。它适用于多达64个请求/进程,但折叠为65.我在I5笔记本电脑上运行Window 7(64位),带有4GB Ram。

在运行测试的同时我打开了Chrome(带有少量选项卡),我希望操作系统的常见系统进程也会产生一些影响,但我对于最低级别的node.js知之甚少。了解问题所在。

例如,有一篇文章建议在2GB 64位Windows XP系统上运行8000多个进程:

http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

但我遇到的64个儿童过程数字相当显眼。

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

Well节点是异步的,没有阻塞,只有当前脚本才能完美地处理多个连接,这意味着在高并发性上,它会使用你所有的CPU,但每个进程只能使用一个核心,因为Node没有线程化。因此,从技术上讲,建议拥有的流程与核心一样多,每个流程一个核心。在这种情况下,在高并发性上,节点集群将使用所有CPU。如果你超过这个,你就是在浪费你的RAM,并在你的操作系统调度程序上投入额外的工作。除此之外,每个nodejs进程都有一个启动时间。因此,在运行时创建nodejs进程非常昂贵。

来自Node.JS docs:

  

这些子节点仍然是V8的全新实例。至少假设   每个新节点启动30ms,内存10mb。也就是说,你做不到   创造了数千个。

结论最好的做法是将CPU分配为CPU核心数量,即:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('death', function(worker) {
    console.log('worker ' + worker.pid + ' died');
    cluster.fork();
  });
} else {
  // Worker processes have a http server.
  http.Server(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(8000);
}

我们实际上有一个生产服务器,这样做可能需要大约1000个并发,并且为hello世界提供不到10ms的延迟。