如何在node.js中检测和测量事件循环阻塞?
我想监控node.js中每次运行事件循环所需的时间。然而,我不确定衡量这一点的最佳方法。我能想出的最好办法如下:如何在node.js中检测和测量事件循环阻塞?,node.js,npm,blocking,event-loop,Node.js,Npm,Blocking,Event Loop,我想监控node.js中每次运行事件循环所需的时间。然而,我不确定衡量这一点的最佳方法。我能想出的最好办法如下: var interval = 500; var interval = setInterval(function() { var last = Date.now(); setImmediate(function() { var delta = Date.now() - last; if (delta > blockD
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
的延迟来推断事件循环运行时间。我在node模块中也看到过同样的方法,但感觉不准确且沉重。有没有更好的方法获取这些信息
更新:将代码更改为使用hapi.js所做的
setImmediate
。您可能还需要查看节点和io.js
中内置的评测。参见本文的示例
这个相关的答案是“有没有更好的方法来获取这些信息?”
我没有比检查SetImmediate的时间延迟更好的方法来测试eventloop,但是使用节点的高分辨率计时器而不是Date.now()
注意:增量将是一个元组数组[秒,纳秒]
有关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.hr时间([时间])
返回[秒,纳秒]元组数组中的当前高分辨率实时值。时间是一个可选参数,必须是前一个process.hrtime()调用(因此,是包含前一时间的[seconds,nanoseconds]元组数组中的实时时间)的结果,以与当前时间区分。这些时间相对于过去的任意时间,与一天中的时间无关,因此不受时钟漂移的影响。主要用途是测量间隔之间的性能
process.nextTick(回调[,arg][,…])
当前事件循环运行完成后,调用回调函数
这不是setTimeout(fn,0)的简单别名,它更有效。它在事件循环的后续节拍中触发任何其他I/O事件(包括计时器)之前运行。检查我现在使用的这个插件,它似乎可以做你想要的事情
let blocked = require("blocked");
blocked(ms => {
console.log("EVENT LOOP Blocked", ms);
});
将打印事件循环被阻止的时间(毫秒),并且他们会不断监视此值,因此这似乎是您最安全的赌注。感谢您的指针。他们使用ossetImmediate
甚至更好。嗨,我这里有个问题,上面的代码只是检测IO成本吗?但是事件循环有不止一个队列,代码是如何检测它的?嗨,我这里有一个问题,上面的代码只是检测IO成本吗?但是事件循环有多个队列,代码如何检测它?
let blocked = require("blocked");
blocked(ms => {
console.log("EVENT LOOP Blocked", ms);
});