/ / Ile procesów potomnych może odrodzić się klaster node.js na 64-bitowym komputerze Wintel? - windows, node.js, współbieżność, 64bit, proces

Ile procesów podrzędnych może odegrać klaster node.js na 64-bitowym komputerze Wintel? - windows, node.js, współbieżność, 64bit, proces

Przeprowadziłem test współbieżności i dlaZe względu na zwięzłość, zdefiniowałem proces dla każdego sfałszowanego żądania HTTP. Działa dobrze dla maksymalnie 64 żądań / procesów, ale spakował się na 65. Korzystam z systemu Windows 7 (64-bitowego) na laptopie I5 z 4 GB pamięci RAM.

Podczas uruchamiania testu miałem otwarty Chrome (zgarść kart) i spodziewam się, że „wspólne procesy systemowe systemu operacyjnego również przyniosłyby pewien efekt, ale wiem za mało o node.js na najniższym poziomie, aby zrozumieć, gdzie leży problem.

Na przykład jeden artykuł sugeruje, że można dobrze uruchomić ponad 8000 procesów w 64-bitowym systemie Windows XP o pojemności 2 GB:

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

Ale 64 proces potomny, na który natrafiłem, był dość widoczny.

Jakieś pomysły?

Odpowiedzi:

11 dla odpowiedzi nr 1

Cóż, węzeł jest asynchroniczny, nie ma blokowania,tylko przez bieżący skrypt i może perfekcyjnie obsługiwać wiele połączeń, co oznacza, że ​​przy wysokiej współbieżności zużywałby cały procesor, ale każdy proces może wykorzystywać tylko jeden rdzeń, ponieważ Węzeł nie jest wątkowy. Technicznie rzecz biorąc, zaleca się posiadanie tylu procesów, ile rdzeni, jeden rdzeń dla każdego procesu. W takim przypadku w wysokiej współbieżności klaster Node wykorzystałby cały procesor. Jeśli pójdziesz dalej, marnujesz pamięć RAM i nakładasz dodatkową pracę na harmonogram systemu operacyjnego. Poza tym każdy proces nodejs ma czas uruchamiania. Dlatego tworzenie procesu nodejs w czasie wykonywania jest bardzo drogie.

Z dokumentów Node.JS:

Te węzły potomne to wciąż zupełnie nowe wystąpienia V8. Załóż przynajmniej Uruchomienie 30 ms i pamięć 10 MB dla każdego nowego węzła. To znaczy nie możesz stworzyć ich tysiące.

Podsumowując, najlepszą rzeczą do zrobienia jest rozwidlenie tak jak liczba rdzeni procesora, czyli:

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);
}

W rzeczywistości mamy do tego serwer produkcyjny, który może zająć około 1000 współbieżności i opóźnienie poniżej 10 ms w świecie cześć.