我无法获得真正的事件循环阻塞时间。我已经搜索了Google的答案(here),但它们对我没有帮助。我得到了不同的结果。
我已经创建了Node / Express应用程序。并尝试使用不同的工具检测事件循环阻塞。我用的是hrtime,pm2,blocked_at。
1个测试:
server.js
require('./routes')(app, passport, mongoData)
routes / 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)
})
我知道了
封锁时间为155994921875ms,操作从此处开始:['在', '位于ArticleService.getArticle(/app/services/article/ArticleService.js:79:44)'] 封锁了14.0350537109375ms,操作从此处开始:['在Promise.then()', '位于ExpressHandlebars.render(node_modules / express-handlebars / lib / express-handlebars.js:157:8)', 在ExpressHandlebars。 (node_modules / express-handlebars / lib / express-handlebars.js:226:29)']
但是我的阻止脚本一无所有!
2个测试:
使用pm2:
删除阻止脚本后,我得到相同的结果。
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)
我得到1秒233毫秒。我有很多时间,但是我很困惑-因为所有操作都在异步模式下进行,所以事件循环不会阻塞吗?
如何测量事件循环块?
我希望得到的输出是:“ routes / index.js:12中的事件循环阻塞5000毫秒”,但实际输出无法捕获我的阻塞脚本。
答案 0 :(得分: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}`);
});
您也可以将节点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}`);
});