如何检测和测量node.js中的事件循环阻塞?
我想监视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);
我基本上通过查看setInterval
的延迟推断事件循环运行时间。 我在阻止的节点模块中看到了相同的方法,但感觉不准确并且很重。 有没有更好的方法来获取这些信息?
更新:将代码更改为使用setImmediate
就像setImmediate
所做的那样。
“有没有更好的方式来获取这些信息?” 我没有比检查SetImmediate的时间延迟更好的方法来测试事件回调,但是使用节点的高分辨率计时器而不是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);
注意:增量将是一个数组[数组,秒,纳秒]。
有关process.hrtime()的更多详细信息,请访问:https://nodejs.org/api/all.html#all_process_hrtime
“主要用途是测量间隔期间的表现。”
码
此代码将测量事件循环触发所用的纳秒时间。 它测量当前过程和下一个滴答之间的时间。
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
});
编辑:添加解释,
process.hrtime([时间])
以[秒,纳秒]元组数组的形式返回当前的高分辨率实时。 time是一个可选参数,它必须是前一个process.hrtime()调用的结果(因此,在包含前一时间的[seconds,nanoseconds]元组数组中的实时时间)与当前时间进行比较。 这些时间相对于过去的任意时间,与时间无关,因此不受时钟漂移的影响。 主要用途是测量间隔之间的表现。
process.nextTick(callback [,arg] [,...])
一旦当前事件循环运行完成,调用回调函数。
这不是setTimeout(fn,0)的简单别名,它更加高效。 它在任何其他I / O事件(包括定时器)在事件循环的后续触发中触发之前运行。
您可能还想查看内置于node
和io.js
中的分析。 例如参见这篇文章http://www.brendangregg.com/flamegraphs.html
和这个相关的SO答案如何调试Node.js应用程序
链接地址: http://www.djcxy.com/p/52657.html上一篇: How to detect and measure event loop blocking in node.js?