2016-09-15 2 views
1

I 4 Kerne haben und lief den Code nach this example:Node.js Cluster - optimale Anzahl der Arbeitnehmer

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

var id = 0; 
if (cluster.isWorker) { 
    id = cluster.worker.id; 
} 

var iterations = 1000000000; 
console.time('Function #' + id); 
for (var i = 0; i < iterations; i++) { 
    var test = 0; 
} 
console.timeEnd('Function #' + id); 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
} 

mit 4 Gabel (der Code oben), ich habe:

Funktion # 0: 1698.801ms

Funktion # 1: 3282.679ms

Funktion # 4: 3290.384ms

Funktion

# 3: 3425.090ms

Funktion # 2: 3424.922ms

Mit 3 Gabel, ich habe:

Funktion # 0: 1695.155ms

Funktion # 2: 1822.867ms

Funktion # 3: 2444.156ms

Funktion # 1:

Mit 2 Gabel 2606.680ms bekam ich:

Funktion # 0: 1684.929ms

Funktion # 1: 1682.897ms

Funktion # 2 : 1686.123ms

Ich verstehe diese Ergebnisse nicht. Ist nicht 1 Gabel/Kern die optimale Nummer? Hier sehe ich, dass 4 Gabel nicht besser als 2 Gabel ist.

Antwort

4

Meine Vermutung ist, dass Ihre Hardware tatsächlich nur 2 physikalische Kerne hat. Aufgrund von hyper-threading (HT) wird das Betriebssystem jedoch sagen, dass 4 (logische) Kerne vorhanden sind.

Die Arbeiter in Ihrem Code behalten einen (physischen) Kern vollständig besetzt, was HT nicht gut behandeln kann, so dass die Leistung, wenn alle 4 logischen Kerne beschäftigt sind, schlechter ist, als wenn Sie nur den 2 physische Kerne beschäftigt.

My Hardware (quad-Kern, so 4 physische und 8 logische Kerne) zeigt das gleiche Muster:

  • 8 Arbeiter:

    Function #5: 926ms 
    Function #3: 916ms 
    Function #1: 928ms 
    Function #4: 895ms 
    Function #7: 934ms 
    Function #6: 905ms 
    Function #8: 928ms 
    Function #2: 928ms 
    
  • 4 Arbeiter:

    Function #3: 467ms 
    Function #2: 467ms 
    Function #1: 473ms 
    Function #4: 472ms 
    

Das sagte, die Faustregel Die Anzahl der Worker, die der Anzahl der logischen Cores in Ihrer Hardware entspricht, ist immer noch sinnvoll, wenn Ihre Worker I/O-gebunden sind (was die meisten Node-Apps sind).

Wenn Sie wirklich schwere, blockierende, Berechnungen durchführen möchten, zählen Sie einen physischen Kern pro Arbeiter.

+0

Danke für die Informationen. Dann für Node.js wird die andere Hälfte der Kerne nur für den asynchronen Code verwendet? Benötigt es Cluster oder bedeutet dies, dass Node.js nur einen Ausführungs-Thread verwendet, ** aber auch ** andere Parallele Threads (~ Kerne?) Für den asynchronen Code? Auch wenn ich ein Spiel entwickle, ist es hauptsächlich CPU-gebunden. Aber ich sah in einer Github-Arbeit einige 'setTimeout (updateClients, 0);' in der Hauptschleife, weil "asynchrone Updates die Leistung erhöhen". Sind sie richtig? – zbeyens

+1

Node selbst plant nichts, das hängt vom Betriebssystem ab (und auch von der CPU selbst). Wenn Sie über CPU-gebundenen Code verfügen, kann 'cluster' Ihnen helfen, weil Sie damit den CPU-lastigen Code in einem separaten Prozess ausführen können, sodass das Betriebssystem einen anderen Code als" Haupt "-Teil der App einplanen kann . Die Verwendung des 'setTimeout()' Tricks ist nützlich, wenn Sie I/O-gebundene und CPU-gebundene Kerne in demselben Prozess mischen. – robertklep

Verwandte Themen