如何检测和测量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事件(包括定时器)在事件循环的后续触发中触发之前运行。


您可能还想查看内置于nodeio.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?

下一篇: How to remote debug Node JS with PHPStorm?