如何debuggingnode.js导致100%的CPU使用率?

我有一个使用Express和Redis的节点应用程序。 在我们的开发服务器上,有一点使用节点开始使用100%cpu。 应用程序仍然响应,但最高报告节点使用100%。 在节点重新启动之前,CPU不会掉落。

我没有把它归结到任何引起它的特定路线或function上。

什么是诊断这个问题的最好方法?

我用v8-profiler查看了node-inspector,它给了我在这里报告的同样的错误https://github.com/dannycoates/v8-profiler/issues/10

       

网上收集的解决方案 "如何debuggingnode.js导致100%的CPU使用率?"

您可以使用node-tick来分析您的应用程序。

  1. 通过sudo npm -g install tick安装node-tick sudo npm -g install tick
  2. 使用已启用的configuration文件node --prof ./app.js运行您的应用程序
  3. 经过一段时间CPU 100%的使用停止你的应用程序
  4. 你可以在你的app目录中看到v8.log,现在你可以用node-tick-processor来读取它
  5. 运行node-tick-processor并解释结果
  6. 加载v8.log到chrome://跟踪分析为树。

节点js cpu 100%

我通过编写一个脚本logging每个请求,然后重放它们,发现了这个问题。

问题是由于我有一个没有被返回的callback。

 myAsncFunc(function(err, data) { if (err) { callback(err) } //node kept going after the error was returned to the user. // make sure you, return callback(err) }) 

这是我的replay.js代码给任何感兴趣的人。

 var request = require('request'); var async = require('async'); var redis = require('redis'); var host = 'http://myhost.com'; var jobs = true; var client = redis.createClient(); async.whilst( function () { return jobs; }, function (callback) { client.lpop('history', function(err, url) { console.log(url); if (!url) { jobs = false; callback(); } request.get({url:host+url}, function() { callback(); }); }) }, function (err) { console.log('done') } ); 

而在你是快递的应用程序。

 app.get('/*', function(req, res, next) { var url = req.originalUrl; redis.rpush('history', url); next(); }); 

这很酷,因为每一个被播放的历史项目都会被重新添加到队列中,所以它会不断循环,每当你访问一个新的页面时,它都会把这个添加到队列中。

我经历了100%的CPU使用率,直到我closures了pipe理员模式(导致节点重启,当文件改变时)。

这可能不会回答这个问题,但如果像我这样的新手担心CPU使用率,这可能是这样的。

也许你有一些使用nextTick计算,这是不断摧毁CPU。

如果你不能运行configuration文件然后很难找出哪个方法是垃圾cpu。 还有一件事是通过使用logging器中间件来检查快速logginghttp://senchalabs.github.com/connect/middleware-logger.html