1

私はしばらくこれを理解しようとしてきました。クラスターを使用する効果をベンチマークするために、ノードに非常に単純な 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 システムでこれを試しましたが、どちらも同じ結果でした。

誰かがこのコードの何が問題なのか説明してもらえますか? または、クラスターを使用する利点/メリットが見られないのはなぜですか?

4

1 に答える 1

1

テストはほぼ純粋に I/O 指向のようにcluster見えますが、その状況では、I/O は関係なく並行しているため、(ご覧のように) を使用してもほとんどメリットがありません。

大きなメリットを得るには、コードの一部が CPU バウンドである必要があります。これは、クラスター ワーカー間で追加の並列処理を提供できるからです。

于 2013-02-23T14:39:09.233 に答える