windows - Hvor mange børneprocesser kan en node.js klynge spawn på en 64bit Wintel PC?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kørte en samtidighedstest, og for korthedens skyld definerede jeg en proces for hver spoofed http-anmodning. Det fungerede fint for op til 64 anmodninger/processer, men foldet på 65. Jeg kører Windows 7 (64 bit) på en I5 laptop, med 4GB Ram.


Mens jeg kørte testen, havde jeg en Chrome åben (med en håndfuld faner), og jeg forventer, at OS'ens fælles systemprocesser også ville have en vis effekt, men jeg ved for lidt om node.js på det laveste niveau for at forstå, hvor problemet ligger.


For eksempel foreslår en artikel, at det er muligt at køre godt over 8000 processer på et 2 GB 64-bit Windows XP-system:


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


Men den 64-årige procesproces, jeg løb ind i, var temmelig iøjnefaldende.


Nogle ideer?

Bedste reference


Brøndknude er asynkron, der er ingen blokering, kun ved det nuværende script, og det kan håndtere flere forbindelser perfekt, så det betyder ved en høj samtidighed, at det ville bruge hele din CPU, men hver proces kan kun bruge en kerne siden Node er ikke gevindskåret. Teknisk set anbefales det at have så mange processer som dine kerner, en kerne for hver proces. I så fald vil Node-klyngen bruge en CPU. Hvis du går mere end at du spilder dit RAM og lægger ekstra arbejde på din OS scheduler. Desuden har hver nodejs proces en opstartstid. Så det er meget dyrt at oprette en nodejs-proces ved kørselstid.


Fra Node.JS docs:



  Disse børsnodes er stadig helt nye forekomster af V8. Antag i det mindste
  30ms opstart og 10mb hukommelse for hver ny Node. Det kan du ikke
  skabe mange tusinde af dem.



Konklusion Det bedste er at gaffel ligesom antallet af dine CPU-kerner, som er:


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


Vi har faktisk en produktionsserver, der gør det, hvilket kan tage omkring 1000 samtidighed og mindre end 10ms latenstid, der serverer hallo verden.