如何检测和测量node.js中的事件循环阻塞?

Fab*_*obs 17 event-loop blocking node.js npm

我想监视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);
Run Code Online (Sandbox Code Playgroud)

我基本上通过查看a的延迟来推断事件循环运行时间setInterval.我在阻塞节点模块中看到了相同的方法,但感觉不准确和沉重.有没有更好的方法来获取这些信息?

更新:更改了代码,以便setImmediate像hapi.js一样使用.

You*_*ohn 8

"有没有更好的方法来获取这些信息?" 我没有比检查SetImmediate的时间延迟更好的方法来测试eventloop,但是你可以使用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);
Run Code Online (Sandbox Code Playgroud)

注意:delta将是一个元组数组[秒,纳秒].

有关process.hrtime()的更多详细信息:https: //nodejs.org/api/all.html#all_process_hrtime

"主要用于测量间隔之间的性能."