2015-02-17 34 views
16

node.js'deki olay döngüsünün her bir çalışmasının ne kadar sürdüğünü izlemek istiyorum. Ancak bunu ölçmenin en iyi yolu hakkında emin değilim. Böyle bakışlarla gelen en iyi yolu:node.js'de olay döngü engellemesi nasıl belirlenir ve ölçülür?

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

Temelde bir setInterval gecikme bakarak olay döngü çalışma süresini anlaması. Aynı yaklaşımı blocked düğüm modülünde gördüm, ancak yanlış ve ağır hissediyor. Bu bilgiye ulaşmanın daha iyi bir yolu var mı?

Güncelleştirme: hapi.js. tarafından yapılan gibi setImmediate kodunu kullanmak için kodu değiştirildi.

+0

[Hapi.js üyeleri benzer şekilde yaparlar] (https://github.com/hapijs/good/blob/ecd705719777af5810dc224001940205cfebd2eb/lib/process.js#L14-L21) ve bu değeri izliyorlar Sürekli olarak, bu en güvenli bahsiniz olurdu. –

+0

İşaretçi için teşekkürler. Onların kullanımı '' setImmediate' bile daha iyidir. –

cevap

7

cevap ilişkili "bu bilgileri almak için daha iyi bir yolu var mı?" Ben SetImmediate gecikme süresinin kontrol daha eventloop sınamak için daha iyi bir yol yok, ancak 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); 

NOT yerine düğümün yüksek çözünürlüklü zamanlayıcı kullanarak daha iyi hassasiyet elde edebilirsiniz: delta tuple Dizisi olacak [saniye, nanosaniye]. process.hrtime() hakkında daha fazla bilgi için

: https://nodejs.org/api/all.html#all_process_hrtime

"birincil kullanımı aralıkları arasında performansını ölçmek içindir."

0

Kod

bu kod tetiklemek için olay döngü aldı nanosaniye zaman ölçecek. Mevcut işlem ile bir sonraki onay arasındaki süreyi ölçer.

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

DÜZENLEME: ilave bir açıklama,

process.hrtime ([saat])

bir [saniye, nanosaniye] demet Array mevcut yüksek-çözünürlükte gerçek zaman verir. time, bir önceki process.hrtime() çağrısının sonucu olması gereken isteğe bağlı bir parametredir (ve daha önceki bir zamanı içeren [saniye, nanosaniye] tuple Array öğesindeki gerçek zaman) geçerli zamana göre farklıdır. Bu zamanlar geçmişte rastgele bir zamana göredir ve günün saati ile ilgili değildir ve bu nedenle saat kaymasına maruz kalmazlar. Birincil kullanım, aralıklar arasındaki performansı ölçmek içindir.

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

akım olay döngü dönüş tamamlanıncaya kadar devam eder sonra geri arama işlevini çağırır.

Bu, setTimeout'un basit bir takma adı değil (fn, 0), çok daha verimli. Olay döngüsünün sonraki adımlarında herhangi bir ek I/O olayı (zamanlayıcılar dahil) ateşlenmeden önce çalışır.