【问题标题】:node js cpu 100%节点js cpu 100%
【发布时间】:2012-11-14 09:02:16
【问题描述】:

我们遇到了一个问题,即每隔一段时间,我们的一个环境中的一个节点应用程序会在 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.js


    【解决方案1】:

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

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

    【讨论】:

    • 小心以 root 身份使用 npm(即 sudo npm。)阅读此处的讨论:stackoverflow.com/questions/16151018/…
    • 天哪,这帮助我发现我删除了一个模块,同时在服务中也需要它。好悲伤。
    【解决方案2】:

    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
    

    Simple profiling

    【讨论】:

      【解决方案3】:

      持续以 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
      

      ……等等。

      【讨论】:

      • 在实时脚本中发现问题!太棒了,谢谢你:D
      【解决方案4】:

      如果你正在使用带有 webpack 的 UI 应用程序,请注意 watchOptionswatch 对我来说,禁用民意调查可以解决问题

      watchOptions: {
         poll: false
      }
      

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

      【讨论】:

      • 这是默认设置。默认情况下,禁用轮询以支持 Fs 事件。这个问题以某种方式与 Fs 事件有关。
      • 好的,请大家注意。也许您的配置由于某种原因已经包含此选项。
      【解决方案5】:

      这是我发现的:

          #!/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

      【讨论】:

        猜你喜欢
        • 2018-04-18
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多