如何检测和测量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。”

您也可能想要查看内置到nodeio.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事件(包括定时器)在事件循环的随后滴答中触发之前运行。