Node.js使用Cluster的性能

时间:2013-02-23 08:31:21

标签: node.js concurrency benchmarking

我一直试图解决这个问题。我在节点中写了一个非常简单的http服务器来测试使用集群的效果。这是我的代码:

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

if(process.argv.length >= 3)
{
  numCPUs = process.argv[2];
}

if (cluster.isMaster && numCPUs > 0) {
  console.log("launching " + numCPUs + " procs");
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    console.log("launching proc #" + i);
    cluster.fork();
  }

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

问题在于我根本没有看到任何性能提升。 1过程大多数时候都有更好的性能。而且,如果我添加更多工作,比如从redis或mongo中检索数据,那么增加流程会有所帮助,但只能适度(大约15%)。我已经在i7 MBPr(带有HT的四核)和i5(四核)Win7系统上尝试了这两种,它们都具有相同的结果。

有人可以解释这段代码有什么问题吗?或者,为什么我没有看到使用群集的优势/好处?

1 个答案:

答案 0 :(得分:1)

您的测试似乎几乎完全是面向I / O的,在这种情况下使用cluster几乎没有什么好处(正如您所见),因为I / O无论如何都是并发的。

要看到一些显着的好处,您需要让部分代码受CPU限制,因为只有这样您才能在集群工作者之间提供额外的并行性。