/ / Quanti processi figlio può generare un cluster node.js su un PC Wintel a 64 bit? - Windows, node.js, concorrenza, 64 bit, processo

Quanti processi figlio possono generare un cluster node.js su un PC Wintel a 64 bit? - windows, node.js, concorrenza, 64 bit, processo

Stavo eseguendo un test di concorrenza e perBrevity "s sake, ha definito un processo per ogni richiesta http falsificata. Ha funzionato bene per un massimo di 64 richieste / processi, ma è stato ripiegato su 65. Utilizzo Windows 7 (64 bit) su un laptop I5, con 4 GB di RAM.

Durante l'esecuzione del test avevo un Chrome aperto (conuna manciata di schede), e mi aspetto che anche i processi di sistema comuni del sistema operativo avrebbero qualche effetto, ma so troppo poco di node.js al livello più basso per capire dove risiede il problema.

Ad esempio, un articolo suggerisce che è possibile eseguire oltre 8000 processi su un sistema Windows XP a 64 bit da 2 GB:

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

Ma il numero di 64 processi figlio in cui mi sono imbattuto era piuttosto evidente.

Qualche idea?

risposte:

11 per risposta № 1

Bene, il nodo è asincrono, non ci sono blocchi,solo dallo script corrente e può gestire perfettamente più connessioni, quindi ciò significa che su un'elevata concorrenza, utilizzerà tutta la CPU, ma ogni processo può utilizzare solo un core, poiché Node non è threaded. Quindi, tecnicamente, ciò che è consigliabile avere è avere tanti processi quanti sono i tuoi core, un core per ogni processo. In tal caso, su una concorrenza elevata il cluster Node utilizzerà tutta la CPU. Se vai oltre, stai sprecando la tua RAM e mettendo del lavoro extra sul tuo programmatore del sistema operativo. Inoltre, ogni processo nodejs ha un tempo di avvio. Quindi è molto costoso creare un processo nodejs in fase di esecuzione.

Dai documenti di Node.JS:

Questi nodi figlio sono ancora istanze completamente nuove di V8. Supponi almeno 30 ms di avvio e 10 MB di memoria per ogni nuovo nodo. Cioè, non puoi crearne molte migliaia.

Conclusione, la cosa migliore da fare è fare il fork del numero di core della CPU, ovvero:

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 worldn");
}).listen(8000);
}

In realtà abbiamo un server di produzione, che lo fa, che può richiedere circa 1000 simultaneità e meno di 10 ms di latenza per servire il mondo hello.