2015-02-17 2 views
16

Ich möchte überwachen, wie lange jeder Lauf der Ereignisschleife in node.js dauert. Ich bin mir jedoch unsicher, wie dies am besten gemessen werden kann. Die beste Weise, die ich oben mit wie folgt aussieht kommen könnte:Wie erkennen und messen Sie die Blockierung von Ereignisschleifen 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); 

Ich schließe grundsätzlich die Laufzeit Ereignisschleife um die Verzögerung eines setInterval suchen. Ich habe den gleichen Ansatz im blocked Knotenmodul gesehen, aber es fühlt sich ungenau und schwer an. Gibt es einen besseren Weg, um zu diesen Informationen zu gelangen?

Update: Changed den Code zu verwenden setImmediate wie von hapi.js getan.

+0

[Die hapi.js Leute tun es in ähnlicher Weise] (https://github.com/hapijs/good/blob/ecd705719777af5810dc224001940205cfebd2eb/lib/process.js#L14-L21), und sie überwachen diesen Wert ständig, so scheint es, dass dies deine sicherste Wette wäre. –

+0

Danke für den Zeiger. Ihre Verwendung os 'setImmediate' ist sogar noch besser. –

Antwort

7

„Gibt es einen besseren Weg, um diese Informationen zu bekommen?“ Ich habe einen besseren Weg, nicht die Ereignisschleife als die Überprüfung der Zeitverzögerung von SetImmediate zu testen, aber Sie können eine bessere Präzision mit Knotens hochauflösende Timer statt 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); 

Hinweis erhalten: Delta wird ein Tupel Array [Sekunden, Nanosekunden].

Weitere Details zu process.hrtime(): https://nodejs.org/api/all.html#all_process_hrtime

"Die primäre Verwendung ist die Leistung zwischen den Intervallen zu messen."

0

-Code

dieser Code wird die Zeit in Nanosekunden messen sie für die Ereignisschleife nahm auszulösen. es misst die Zeit zwischen dem aktuellen Prozess und dem nächsten Tick.

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: hinzugefügt Erklärung,

process.hrtime ([Zeit])

Gibt die aktuelle Echtzeit mit hohen Auflösung in einer [Sekunden ns] Tupel Array. time ist ein optionaler Parameter, der das Ergebnis eines vorherigen process.hrtime() -Aufrufs sein muss (und daher eine Echtzeit in einem [Sekunden, Nanosekunden] -Tupel-Array, das eine vorhergehende Zeit enthält), um mit der aktuellen Zeit zu diff. Diese Zeiten sind relativ zu einer beliebigen Zeit in der Vergangenheit und nicht mit der Tageszeit verbunden und unterliegen daher keiner Taktdrift. Die primäre Verwendung ist die Messung der Leistung zwischen Intervallen.

process.nextTick (Callback [Arg] [...])

Sobald der Strom wiederum Ereignisschleife zum Abschluss ausgeführt wird, die Callback-Funktion aufrufen.

Dies ist kein einfacher Alias ​​für setTimeout (fn, 0), es ist viel effizienter. Es wird ausgeführt, bevor zusätzliche E/A-Ereignisse (einschließlich Timer) in nachfolgenden Ticks der Ereignisschleife ausgelöst werden.

Verwandte Themen