如何检测和测量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的时间延迟更好的方法来testingeventloop,但是使用node的高分辨率计时器而不是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);
注:delta将是一个数组[数组,秒,纳秒]。
有关process.hrtime()的更多详细信息: https : //nodejs.org/api/all.html#all_process_hrtime
“主要用途是测量间隔期间的performance。”
您也可能想要查看内置到node
和io.js
中的分析。 例如看这篇文章http://www.brendangregg.com/flamegraphs.html
和这个相关的SO回答如何debuggingNode.js应用程序
码
此代码将测量事件循环触发所用的纳秒时间。 它测量当前过程和下一个滴答之间的时间。
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([时间])
以[秒,纳秒]元组数组的forms返回当前的高分辨率实时。 time是一个可选参数,它必须是前一个process.hrtime()调用的结果(因此,在包含前一时间的[seconds,nanoseconds]元组数组中的实时时间)与当前时间进行比较。 这些时间是相对于过去的任意时间而言的,与时间不相关,因此不受时钟漂移的影响。 主要用于衡量间隔期间的performance。
process.nextTick(callback [,arg] [,…])
一旦当前的事件循环运行完成,调用callback函数。
这不是setTimeout(fn,0)的简单别名,它更有效率。 它在任何其他I / O事件(包括定时器)在事件循环的随后滴答中触发之前运行。