如何测量Nodejs中的事件循环阻塞?

问题描述 投票:1回答:1

我无法获得真正的事件循环阻塞时间。我搜索了谷歌的答案(here),但他们对我没有帮助。我得到了不同的结果。

我创建了Node / Express应用程序。并尝试使用不同的工具检测事件循环阻塞。我用过hrtime,pm2,blocked_at

1测试:

server.js

require('./routes')(app, passport, mongoData)

路线/ index.js

router
  .get('/articles/:articleId(\\d+)', (req, res, next) => { 
      const blockedAt = require('blocked-at')
      blockedAt((time, stack) => {
         console.log(`Blocked for ${time}ms, operation started here:`, stack)
            },  {threshold:12})

      // my blocking script
      for (let i = 0; i <= 1000000000; i++) {
          let z = 10000 / Math.random()         
      }

      let ArticleController = require(path + 'app/controllers/ArticleController')
      let articleController = new ArticleController()
      articleController.index(req, res, next)
    })

我有:

阻止15.5994921875ms,操作从这里开始:['at','在ArticleService.getArticle(/app/services/article/ArticleService.js:79:44)']被阻止为14.0350537109375ms,操作从这里开始:['在Promise ExpressHandlebars上的.then()','在ExpressHandlebars.render(node_modules / express-handlebars / lib / express-handlebars.js:157:8)','。 (node_modules / express-handlebars / lib / express-handlebars.js:226:29)']

但没有关于我的阻止脚本!

2测试:

用pm2:

  • 事件循环延迟 - 0.56ms
  • 事件循环延迟p95 - 4.5ms

删除我的阻止脚本后,我得到相同的结果。

3测试:

使用hrtime我在ArticleController.index中测量。索引方法以异步模式加载3个服务。有很多I / O操作,并且工作有worker_threads。一些代码创建到setImmediate中。

进入索引:

let hrstart = process.hrtime()

// there works all my services 
//...

let hrend = process.hrtime(hrstart)
 console.info('Execution time (hr): %ds ir ms: %dms', hrend[0], hrend[1] / 1000000)

res.render('home', data)

我有1s,233ms。我很开心,但我很困惑 - 因为所有操作都在异步模式下工作,事件循环没有阻塞?

我如何测量事件循环块?

我期望输出:“在routes / index.js中阻止事件循环:12秒为5000毫秒”,但实际输出没有捕获我的阻塞脚本。

node.js performance asynchronous nonblocking
1个回答
0
投票

阻止事件循环的时间量是您按顺序处理的时间。您的示例将是该函数的主体。所以你可以只计算时间并将其添加到变量中。

let totalBlocked = 0;

router
  .get('/articles/:articleId(\\d+)', (req, res, next) => { 
      const start = new Date().getTime();

      // my blocking script
      for (let i = 0; i <= 1000000000; i++) {
          let z = 10000 / Math.random() ;        
      }

      let ArticleController = require(path + 'app/controllers/ArticleController');
      let articleController = new ArticleController();
      articleController.index(req, res, next);

      const total = new Date().getTime() - start;
      totalBlocked += total;
      console.log(`Blocked for ${total}. Total blocked time is ${totalBlocked}`);
    });

您还可以使用Node perf_hooks进行高分辨率计时。

const {performance } = require('perf_hooks');

let totalBlocked = 0;

router
  .get('/articles/:articleId(\\d+)', (req, res, next) => { 
      const start = performance.now();
      // Do stuff
      const total = performance.now() - start;
      totalBlocked += total;
      console.log(`Blocked for ${total}. Total blocked time is ${totalBlocked}`);
   });
© www.soinside.com 2019 - 2024. All rights reserved.