2015-06-23 18 views
6

Ho un server NodeJS (Express) e sto diffondendo le richieste a più processori utilizzando l'esempio del modulo cluster sul sito nodeJs.Come aumentare la velocità effettiva su un server NodeJS utilizzando il cluster?

if (cluster.isMaster) { 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    }; 
    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    cluster.fork(); 
    }); 
} else { 
    server.listen(app.get('port'), function(){ 
    console.log('HTTP server on port ' + app.get('port') + ' - running as ' + app.settings.env); 
    }); 

    // setup socket.io communication 
    io.sockets.on('connection', require('./app/sockets')); 
    io.sockets.on('connection', require('./app/downloadSockets')); 
} 

Il problema è che il punto di riferimento da dell'assedio mi dimostra che non v'è alcun aumento del numero di colpi. Questa è l'uscita d'assedio:

$ siege -c100 192.168.111.1:42424 -t10S 
** SIEGE 3.0.5 
** Preparing 100 concurrent users for battle. 
The server is now under siege... 
Lifting the server siege...  done. 

Transactions:    1892 hits 
Availability:    100.00 % 
Elapsed time:    10.01 secs 
Data transferred:   9.36 MB 
Response time:    0.01 secs 
Transaction rate:   189.01 trans/sec 
Throughput:    0.93 MB/sec 
Concurrency:    1.58 
Successful transactions:  1892 
Failed transactions:    0 
Longest transaction:   0.05 
Shortest transaction:   0.00 

Dopo Clustering:

$ siege -c100 192.168.111.1:42424 -t10S 
** SIEGE 3.0.5 
** Preparing 100 concurrent users for battle. 
The server is now under siege... 
Lifting the server siege...  done. 

Transactions:    1884 hits 
Availability:    100.00 % 
Elapsed time:    9.52 secs 
Data transferred:   9.32 MB 
Response time:    0.01 secs 
Transaction rate:   197.90 trans/sec 
Throughput:    0.98 MB/sec 
Concurrency:    1.72 
Successful transactions:  1884 
Failed transactions:    0 
Longest transaction:   0.07 
Shortest transaction:   0.00 

Significa che il mio server sta già ottenendo un throughput massimo, con il singolo server, probabilmente perché la sua una macchina locale o forse La sua non è in grado di ottenere 4 processori in quanto ci sono troppi processi in esecuzione, non sono sicuro.

Come utilizzare il modulo cluster per aumentare il throghput e perché il mio codice corrente non si verifica? Inoltre ho controllato che effettivamente crea 4 istanze del server in cui funziona il cluster.fork. Qualsiasi suggerimento sarebbe molto utile.

+1

sei limitato dal tuo hardware. – Mox

+1

@Mox Questo è quello che penso anch'io, ma dal momento che utilizzo un solo processore in un caso e tutti gli altri nel secondo caso, suppongo che io sottovaluti il ​​mio hardware nel primo caso quindi dovrei ottenere un throughput migliore a meno che il collo di bottiglia non sia altrove. Non sei sicuro di come trovare quel collo di bottiglia –

+1

Hai più di una CPU nel tuo sistema? Il clustering funziona sull'avvio di un nuovo processo per ogni CPU trovata, se si dispone di un solo clustering è inutile. –

risposta

6

L'effetto viene ottenuto dal cluster o dalle query di crescita simultanee (provare ad aumentare il numero di utenti contemporanei a 300-400). O compiti che danno un onere serio. Facciamo un test più interessante: scaricherò una dimensione del file di circa 1 MB, inoltre eseguiamo un ritardo di 5 msec e 50 msec per l'emulazione di operazioni complesse. Per il processore quattro core a una sperimentazione locale saranno i seguenti (rispettivamente normale e cluster):

$ siege -c100 http://localhost/images/image.jpg -t10S 

Modalità Normale (5 ritardo msec):

Lifting the server siege...  done. 
Transactions:     1170 hits 
Availability:     100.00 % 
Elapsed time:     9.10 secs 
Data transferred:    800.79 MB 
Response time:     0.27 secs 
Transaction rate:    128.57 trans/sec 
Throughput:     88.00 MB/sec 
Concurrency:     34.84 
Successful transactions:  1170 
Failed transactions:    0 
Longest transaction:   0.95 
Shortest transaction:   0.01 

modalità Cluster (5 ritardo msec) :

Lifting the server siege...  done. 
Transactions:     1596 hits 
Availability:     100.00 % 
Elapsed time:     9.04 secs 
Data transferred:   1092.36 MB 
Response time:     0.06 secs 
Transaction rate:    176.55 trans/sec 
Throughput:     120.84 MB/sec 
Concurrency:     9.81 
Successful transactions:  1596 
Failed transactions:    0 
Longest transaction:   0.33 
Shortest transaction:   0.00 

modalità normale (50 ritardo msec):

Lifting the server siege...  done. 
Transactions:      100 hits 
Availability:     100.00 % 
Elapsed time:     9.63 secs 
Data transferred:    68.44 MB 
Response time:     5.51 secs 
Transaction rate:    10.38 trans/sec 
Throughput:      7.11 MB/sec 
Concurrency:     57.18 
Successful transactions:   100 
Failed transactions:    0 
Longest transaction:   7.77 
Shortest transaction:   5.14 

modalità Cluster (ritardo 50 msec):

Lifting the server siege...  done. 
Transactions:      614 hits 
Availability:     100.00 % 
Elapsed time:     9.24 secs 
Data transferred:    420.25 MB 
Response time:     0.90 secs 
Transaction rate:    66.45 trans/sec 
Throughput:     45.48 MB/sec 
Concurrency:     59.59 
Successful transactions:   614 
Failed transactions:    0 
Longest transaction:   1.50 
Shortest transaction:   0.50 
2

non si è realmente facendo nulla nel tuo esempio. Connettiti a mysql ed esegui una query pesante o fai una richiesta http che impiega qualche secondo. Si nota che alla fine, si codificherà qualcosa (o si utilizzerà una libreria di terze parti) che bloccherà il ciclo degli eventi. Questo è il momento in cui il clustering sarà importante, dal momento che avrai essenzialmente un ciclo di eventi per ciascun processore. Se una query è lenta e il ciclo degli eventi deve attendere, non interromperà le nuove richieste che stanno colpendo la tua API/applicazione.

Inoltre, è possibile leggere il pool di connessioni e, in particolare, il pool generico su npm se si prevede di utilizzare o connettersi a un database o di recuperare risorse esterne.

Problemi correlati