Ну, узел является асинхронным, нет блокировки, только текущим сценарием, и он может отлично обрабатывать несколько соединений, так что при высоком параллелизме он будет использовать весь ваш ЦП, но каждый процесс может использовать только одно ядро, Так как 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 мс, обслуживая мир приветствия.