首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测和测量node.js中的事件循环阻塞?

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

Stack Overflow用户
提问于 2015-02-17 22:11:34
回答 4查看 12.8K关注 0票数 19

我想监控node.js中事件循环的每次运行所需的时间。然而,我不确定衡量这一点的最佳方式。我能想到的最好的方法是:

代码语言:javascript
复制
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的延迟来推断事件循环的运行时间。我在blocked节点模块中看到了同样的方法,但感觉不准确和笨重。有没有更好的方法来获取这些信息?

更新:按照hapi.js的做法,将代码更改为使用setImmediate

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-07 22:18:22

“有没有更好的方法来获取这些信息?”我没有比检查SetImmediate的时间延迟更好的方法来测试eventloop,但是您可以使用node的高精度计时器而不是Date.now()来获得更高的精度

代码语言:javascript
复制
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

“主要用途是测量间隔之间的性能。”

票数 10
EN

Stack Overflow用户

发布于 2019-08-07 05:30:04

看看这个插件https://github.com/tj/node-blocked,我现在正在用它,它似乎能做你想要的事情。

代码语言:javascript
复制
let blocked = require("blocked");

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-06-10 08:51:06

代码

此代码将以纳秒为单位测量事件循环触发所用的时间。它测量当前进程和下一次滴答之间的时间。

代码语言:javascript
复制
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(时间)

返回当前高分辨率实时数组,单位为纳秒数组。时间是一个可选参数,它必须是前一个process.hrtime()调用的结果(因此,一个以秒为单位的实时时间,包含前一个时间的纳秒元组数组),以便与当前时间不同。这些时间相对于过去的任意时间,与一天中的时间无关,因此不受时钟漂移的影响。它的主要用途是测量间隔之间的性能。

Process.nextTick(回调,参数)

当前事件循环运行完成后,调用回调函数。

这不是setTimeout(fn,0)的简单别名,它的效率要高得多。它在事件循环的后续节拍中触发任何其他I/O事件(包括计时器)之前运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28563354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档