node js cpu 100%

时间:2012-11-14 09:02:17

标签: node.js

我们遇到的问题是,我们的节点应用程序每隔一段时间就会在100%CPU上运行。服务器不是非常活跃,通常在0%-2%CPU上运行。 我想知道可能导致此问题的常见问题是什么,以及找出导致此问题的原因的最佳方法。

服务器规格:

  

节点版本0.8.14
  ubuntu 11.10
  英特尔(R)Xeon(R)CPU E5645 @ 2.40GHz

使用的节点包:

"express" : 2.5.x,
"log" : "1.2.x",
"redis" : "0.8.x",
"socket.io" : "0.9.x",
"mongodb": ">= 0.9.6-7",
"passport" : "0.x.x",
"passport-local" : "0.x.x",

5 个答案:

答案 0 :(得分:33)

您可以使用node-tick配置应用。

  1. node-tick
  2. 安装sudo npm -g install tick
  3. 使用已启用的个人资料node --prof ./app.js
  4. 运行您的应用
  5. 使用CPU 100%使用一段时间后停止使用您的应用
  6. 您可以在app目录中看到v8.log,现在可以使用node-tick-processor
  7. 阅读它
  8. 运行node-tick-processor并解释结果

答案 1 :(得分:2)

更新2019 !!

您最好使用内置的 summary(lm(formula = rent ~ factor(region) + factor(region) * floorspace - floorspace, data=mydataset)) Call: lm(formula = rent ~ factor(region) + factor(region) * floorspace - floorspace, data = mydataset) Residuals: Min 1Q Median 3Q Max -0.52917 -0.26151 0.01225 0.24816 0.52392 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.50329 0.09238 5.448 4.23e-07 *** factor(region)2 0.01331 0.13804 0.096 0.923 factor(region)3 0.05716 0.16860 0.339 0.735 factor(region)4 -0.03252 0.16234 -0.200 0.842 factor(region)1:floorspace 0.16273 0.22805 0.714 0.477 factor(region)2:floorspace 0.01638 0.19894 0.082 0.935 factor(region)3:floorspace -0.14251 0.20262 -0.703 0.484 factor(region)4:floorspace -0.05094 0.24191 -0.211 0.834 来处理v8分析数据,生成的文件不再是v8.log,并且--prof-process对您没有多大帮助,因此对您的应用程序进行配置并阅读v8分析数据,您可以按以下步骤进行操作:

node-tick-processor

Node将在当前目录中生成一个名称为node --prof your_script.js 的文件,现在您使用该文件来生成性能分析报告

isolate-0x103800000-v8.log

Simple profiling

答案 2 :(得分:0)

如果您将UI应用程序与Webpack一起使用,请注意watchOptionswatch 对我来说,禁用民意测验可以解决问题

watchOptions: {
   poll: false
}

https://webpack.js.org/configuration/watch/#watchoptionsignored

答案 3 :(得分:0)

恒定循环通常以100%CPU恒定运行。在单线程nodejs中,这是一个真正的问题,但不幸的是,它缺少相关信息。

最终,我发现了唯一有用的article: 如何在nodejs中跟踪死循环:

通过SSH连接到服务器。标识nodejs进程ID(例如,使其为4702)。 现在,告诉我们侦听调试请求的过程。 是的,我们使用的命令是kill。不,我们不会终止该过程。我们正在向它发送不同的信号。

kill -SIGUSR1 4702

执行此操作后,该过程将打开调试器连接。实际上,它将在控制台日志中打印一个特殊的URL,您可以在Chrome中打开该URL来调试该过程!但是,也许您不想只是为了建立连接而在防火墙和容器配置中钻孔。是的,我也没有。 因此,让我们在命令行进行调试:

node inspect -p 4702

您会看到以下提示:

debug>

然后输入:

pause

然后您回来:

break in file:///somewhere/something.js:555
>555         for (prop in inputObject) {
510             if (hasOwnProp(inputObject, prop)) {
511                 normalizedProp = normalizeUnits(prop);

是的!我们有第一个提示。该应用程序正在执行something.js文件中的第555行。 这可能足以立即看到该错误。但是通常我们需要更多的信息。您可以键入backtrace以获得完整的堆栈跟踪:

#0 someFunctionName file:///somewhere/somefile.js:444:22
#1 someFunctionName file:///somewhere/somefile.js:555:33
#2 someFunctionName file:///somewhere/somefile.js:666:44

...依此类推。

答案 4 :(得分:-1)

这是我发现的:

    #!/usr/bin/env node

require(__dirname+"/processor-usage.js").startWatching();

var shouldRun = true;
var desiredLoadFactor = .5;

function blockCpuFor(ms) {
    var now = new Date().getTime();
    var result = 0
    while(shouldRun) {
        result += Math.random() * Math.random();
        if (new Date().getTime() > now +ms)
            return;
    }   
}

function start() {
    shouldRun = true;
    blockCpuFor(1000*desiredLoadFactor);
    setTimeout(start, 1000* (1 - desiredLoadFactor));
}

setInterval(function() {
    console.log("current process cpu usage: "+(global.processCpuUsage || 0)+"%");}
, 1000);

if (process.argv[2]) {
    var value = parseFloat(process.argv[2]);
    if (value < 0 || value > 1) {
        console.log("please give desired load value as a range [0..1]");
    process.exit(-1);
    } else {
        desiredLoadFactor = value;
    }
}
start();

on http://blackholethought.blogspot.de/2012/08/measuring-cpu-usage-of-nodejs-from.html