2015-02-17 26 views
16

Chciałbym monitorować, jak długo trwa uruchamianie pętli zdarzeń w pliku node.js. Jednak nie jestem pewien, jak najlepiej to zmierzyć. Najlepszym sposobem mogłem wymyślić wygląda następująco:Jak wykrywać i mierzyć blokowanie pętli zdarzeń w pliku 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); 

I w zasadzie wnioskować czas pracy pętli zdarzeń patrząc na zwłoki z setInterval. Widziałem to samo podejście w module węzła blocked, ale jest ono niedokładne i ciężkie. Czy istnieje lepszy sposób na uzyskanie tych informacji?

Aktualizacja: Zmieniono kod, który ma być używany jako setImmediate zgodnie z hapi.js.

+0

[Ludzie hapi.js robią to w podobny sposób] (https://github.com/hapijs/good/blob/ecd705719777af5810dc224001940205cfebd2eb/lib/process.js#L14-L21) i monitorują tę wartość stale, więc wygląda na to, że jest to najbezpieczniejszy zakład. –

+0

Dzięki za wskaźnik. Ich użycie os 'setImmediate' jest jeszcze lepsze. –

Odpowiedz

7

„Czy jest lepszy sposób, aby uzyskać te informacje?” Nie ma lepszego sposobu, aby przetestować eventloop niż sprawdzanie opóźnienie czasowe SetImmediate, ale można uzyskać lepszą precyzję przy użyciu wysokiej rozdzielczości czasomierza węzła zamiast 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); 

UWAGA: delta będzie Array krotka [sekundy, nanosekundy].

Więcej informacji na temat process.hrtime(): https://nodejs.org/api/all.html#all_process_hrtime

"Podstawowym zastosowaniem jest pomiar wydajności między odstępach czasu."

0

Kod

ten kod będzie mierzyć czas w nanosekund zajęło pętli zdarzeń do wyzwalania. mierzy czas między bieżącym procesem a następnym kleszczem.

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

Edycja: dodano wyjaśnienie

process.hrtime ([czas])

Zwraca bieżącą o wysokiej rozdzielczości w czasie rzeczywistym [sekund, nanosekund] tablicy krotki. time jest opcjonalnym parametrem, który musi być wynikiem wcześniejszego wywołania process.hrtime() (a więc i czasu rzeczywistego w [sekund, nanosekundach] krotnej tablicy zawierającej poprzedni czas) w celu zmieniania bieżącego czasu. Te czasy odnoszą się do arbitralnego czasu w przeszłości i nie są związane z porą dnia, a zatem nie podlegają dryfowaniu zegara. Głównym zastosowaniem jest mierzenie wydajności między interwałami.

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

Gdy prąd kolej pętli zdarzeń przebiega do końca po wywołaniu funkcji zwrotnego.

To nie jest zwykły alias dla setTimeout (fn, 0), jest znacznie bardziej wydajny. Działa przed każdym kolejnym zdarzeniem I/O (włączając w to timery) w kolejnych tykrach pętli zdarzeń.

Powiązane problemy