Производительность Node.js с использованием кластера

Я пытался понять это некоторое время. Я написал очень простой 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 ответ

Решение

Ваш тест, кажется, почти полностью ориентирован на ввод-вывод и в этой ситуации использует cluster обеспечивает небольшую выгоду (как вы видели), потому что ввод-вывод выполняется одновременно.

Чтобы увидеть значительное преимущество, вам нужно иметь части кода, которые связаны с процессором, потому что только тогда вы сможете обеспечить дополнительный параллелизм между работниками кластера.

Другие вопросы по тегам