Сколько дочерних процессов может порождать кластер node.js на 64-битном ПК Wintel? - PullRequest
3 голосов
/ 14 февраля 2012

Я проводил тест на параллелизм и для краткости определил процесс для каждого поддельного http-запроса.Он прекрасно работал до 64 запросов / процессов, но сложен на 65. Я использую Windows 7 (64-разрядную версию) на ноутбуке I5 с 4 ГБ памяти Ram.

Во время выполнения теста у меня был открыт Chrome (с несколькими вкладками), и я ожидаю, что общие системные процессы ОС также будут иметь некоторый эффект, но я слишком мало знаю о node.js всамый низкий уровень, чтобы понять, в чем заключается проблема.

Например, в одной статье предполагается, что в 64-битной системе Windows XP 2 ГБ можно запустить более 8000 процессов:

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

Но фигура 64 дочерних процессов, с которой я столкнулся, была довольно заметной.

Есть идеи?

1 Ответ

11 голосов
/ 14 февраля 2012

Ну, узел является асинхронным, нет блокировки, только текущим сценарием, и он может отлично обрабатывать несколько соединений, так что при высоком параллелизме он будет использовать весь ваш ЦП, но каждый процесс может использовать только одно ядро, Так как Node не имеет резьбу. Технически, то, что рекомендуется иметь, это иметь столько процессов, сколько ваших ядер, по одному ядру на каждый процесс. В этом случае при высоком параллелизме кластер Node будет использовать весь процессор. Если вы идете больше, вы тратите свою оперативную память и вкладываете дополнительную работу в планировщик ОС. Кроме того, у каждого процесса nodejs есть время запуска. Поэтому очень дорого создавать процесс nodejs во время выполнения.

Из документов Node.JS:

Эти дочерние узлы все еще являются новыми экземплярами V8. Примите хотя бы 30 мс запуска и 10 Мб памяти для каждого нового узла. То есть вы не можете создать много тысяч из них.

Вывод: лучшее, что нужно сделать, это разветвляться так же, как и количество ядер вашего процессора, а именно:

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 одновременных операций и с задержкой менее 10 мс, обслуживая мир приветствия.

...