Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在node.js中检测和测量事件循环阻塞?_Node.js_Npm_Blocking_Event Loop - Fatal编程技术网

如何在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

我想监控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
的延迟来推断事件循环运行时间。我在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);
});

将打印事件循环被阻止的时间(毫秒)

,并且他们会不断监视此值,因此这似乎是您最安全的赌注。感谢您的指针。他们使用os
setImmediate
甚至更好。嗨,我这里有个问题,上面的代码只是检测IO成本吗?但是事件循环有不止一个队列,代码是如何检测它的?嗨,我这里有一个问题,上面的代码只是检测IO成本吗?但是事件循环有多个队列,代码如何检测它?
let blocked = require("blocked");

blocked(ms => {
  console.log("EVENT LOOP Blocked", ms);
});