2015-02-17 23 views
16

Tôi muốn theo dõi thời gian chạy mỗi vòng lặp sự kiện trong node.js. Tuy nhiên tôi không chắc chắn về cách tốt nhất để đo lường điều này. Cách tốt nhất mà tôi có thể đưa ra trông như sau:Làm thế nào để phát hiện và đo sự kiện chặn vòng lặp trong 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); 

tôi về cơ bản suy ra thời gian chạy vòng lặp sự kiện bằng cách nhìn vào sự chậm trễ của một setInterval. Tôi đã nhìn thấy cách tiếp cận tương tự trong mô-đun nút blocked nhưng nó cảm thấy không chính xác và nặng. Có cách nào tốt hơn để truy cập thông tin này không?

Cập nhật: Thay đổi mã để sử dụng setImmediate như thực hiện bằng cách hapi.js.

+0

[Nhân viên hapi.js cũng làm như vậy] (https://github.com/hapijs/good/blob/ecd705719777af5810dc224001940205cfebd2eb/lib/process.js#L14-L21) và họ đang theo dõi giá trị này liên tục, do đó, có vẻ như đây sẽ là đặt cược an toàn nhất của bạn. –

+0

Cảm ơn con trỏ. Os sử dụng 'setImmediate' của họ thậm chí còn tốt hơn. –

Trả lời

7

"Có cách nào tốt hơn để có được thông tin này?" Tôi không có một cách tốt hơn để kiểm tra eventloop hơn kiểm tra thời gian trễ của SetImmediate, nhưng bạn có thể có được độ chính xác tốt hơn sử dụng timer độ phân giải cao nút thay vì 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); 

LƯU Ý: đồng bằng sẽ là một tuple Mảng [giây, nano giây].

Để biết thêm chi tiết về process.hrtime(): https://nodejs.org/api/all.html#all_process_hrtime

"Việc sử dụng chính là để đo lường hiệu suất giữa các khoảng thời gian."

0

mã này sẽ đo thời gian bằng nano giây để vòng lặp sự kiện kích hoạt. nó đo thời gian giữa quá trình hiện tại và đánh dấu tiếp theo.

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: thêm lời giải thích,

process.hrtime ([thời gian])

Trả về độ phân giải cao thời gian thực hiện trong một [giây, nano giây] tuple Array. thời gian là một tham số tùy chọn phải là kết quả của một cuộc gọi process.hrtime() trước đó (và do đó, một thời gian thực trong một [giây, nano giây] tuple Mảng có chứa một thời gian trước đó) để khác với thời gian hiện tại. Những thời gian này liên quan đến một thời gian tùy ý trong quá khứ, và không liên quan đến thời gian trong ngày và do đó không bị trôi dạt đồng hồ. Việc sử dụng chính là để đo hiệu suất giữa các khoảng thời gian.

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

Khi vòng lặp sự kiện hiện tại lần lượt chạy đến khi kết thúc, gọi hàm callback.

Đây không phải là bí danh đơn giản cho setTimeout (fn, 0), nó hiệu quả hơn nhiều. Nó chạy trước bất kỳ sự kiện I/O bổ sung nào (bao gồm cả bộ tính giờ) kích hoạt các dấu tích tiếp theo của vòng lặp sự kiện.

Các vấn đề liên quan