繁体   English   中英

节点 js cpu 100%

[英]node js cpu 100%

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

服务器规格:

节点版本 0.8.14
Ubuntu 11.10
Intel(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",

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

  1. 通过npm -g install tick安装node-tick npm -g install tick
  2. 使用启用的配置文件node --prof ./app.js运行您的应用程序node --prof ./app.js
  3. 在 CPU 100% 使用一段时间后停止您的应用程序
  4. 您可以在您的应用程序目录中看到 v8.log,现在您可以使用 node-tick-processor 读取它
  5. 运行node-tick-processor并解释结果

2019 年更新!!

您最好使用内置的--prof-process来处理 v8 分析数据,生成的文件不再是 v8.log 并且node-tick-processor对您没有太大帮助,因此要分析您的应用并读取 v8 分析数据您可以按以下步骤操作:

node --prof your_script.js

Node会在你当前目录下生成一个类似isolate-0x103800000-v8.log这样名字的文件,现在你用这个文件来生成分析报告

node --prof-process isolate-0x103800000-v8.log > processed.txt

简单的分析

持续以 100% CPU 运行是无限循环的典型特征。 这在单线程 nodejs 中是一个真正的问题,但不幸的是缺乏关于它的信息。

最终我找到了唯一有用的文章:如何在 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

… 等等。

如果你使用带有 webpack 的 UI 应用程序,请注意watchOptionswatch对我来说,禁用 poll 解决问题

watchOptions: {
   poll: false
}

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

这是我发现的:

    #!/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();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM