2015-02-17 5 views
16

Vorrei monitorare per quanto tempo ogni esecuzione del ciclo eventi in node.js ha luogo. Tuttavia sono incerto sul modo migliore per misurare questo. Il modo migliore che potevo venire con un look come questo:Come rilevare e misurare il blocco del ciclo di eventi in node.js?

var interval = 500; 
var interval = setInterval(function() { 
    var last = Date.now();   
    setImmediate(function() { 
     var delta = Date.now() - last; 
     if (delta > blockDelta) { 
      report("node.eventloop_blocked", delta); 
     } 
    }); 
}, interval); 

ho praticamente dedurre il tempo di esecuzione ciclo di eventi, cercando in ritardo di un setInterval. Ho visto lo stesso approccio nel modulo di nodo blocked ma sembra inaccurato e pesante. C'è un modo migliore per ottenere queste informazioni?

Aggiornamento: modificato il codice per utilizzare setImmediate come fatto da hapi.js.

+0

[La gente hapi.js lo fa in un modo simile] (https://github.com/hapijs/good/blob/ecd705719777af5810dc224001940205cfebd2eb/lib/process.js#L14-L21), e stanno monitorando questo valore costantemente, quindi sembra che questa sarebbe la tua scommessa più sicura. –

+0

Grazie per il puntatore. Il loro uso os 'setImmediate' è ancora migliore. –

risposta

7

"C'è un modo migliore per ottenere queste informazioni?" Non ho un modo migliore per testare l'eventloop di controllare il ritardo di SetImmediate, ma si può ottenere una migliore precisione utilizzando timer ad alta risoluzione del nodo invece di Date.now()

var interval = 500; 
var interval = setInterval(function() { 
    var last = process.hrtime();   // replace Date.now()   
    setImmediate(function() { 
     var delta = process.hrtime(last); // with process.hrtime() 
     if (delta > blockDelta) { 
      report("node.eventloop_blocked", delta); 
     } 
    }); 
}, interval); 

NOTA: delta sarà un array tupla [secondi, nanosecondi].

Per maggiori dettagli su process.hrtime(): https://nodejs.org/api/all.html#all_process_hrtime

"L'uso primario è per la misurazione delle prestazioni tra gli intervalli."

0

Codice

questo codice misurare il tempo in nanosecondi ci sono voluti per il ciclo di eventi per attivare. misura il tempo tra il processo corrente e il tick successivo.

var time = process.hrtime(); 
process.nextTick(function() { 
    var diff = process.hrtime(time); 


    console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]); 
    // benchmark took 1000000527 nanoseconds 
}); 

EDIT: spiegazione aggiunto,

process.hrtime ([ora])

Restituisce il tempo reale ad alta risoluzione corrente in un [secondi, nanosecondi] tuple Array. time è un parametro facoltativo che deve essere il risultato di una precedente chiamata process.hrtime() (e quindi, in tempo reale in un array di tuple [secondi, nanosecondi] contenente una volta precedente) da diff con l'ora corrente. Questi tempi sono relativi a un tempo arbitrario nel passato e non correlati all'ora del giorno e quindi non soggetti a deriva dell'orologio. L'uso principale è per misurare le prestazioni tra intervalli.

process.nextTick (richiamata [, arg] [, ...])

Una volta che l'attuale ciclo di eventi sua volta esegue fino al completamento, chiamare la funzione di callback.

Questo non è un semplice alias di setTimeout (fn, 0), è molto più efficiente. Funziona prima che gli eventi I/O aggiuntivi (inclusi i timer) si accendano nelle battute successive del ciclo degli eventi.

Problemi correlati