【问题标题】:How to find out the % CPU usage for Node.js process?如何找出 Node.js 进程的 % CPU 使用率?
【发布时间】:2011-12-08 02:22:00
【问题描述】:

有没有办法通过代码找出 node.js 进程的 cpu 使用率。这样当 node.js 应用程序在服务器上运行并检测到 CPU 超过一定百分比时,它就会发出警报或控制台输出。

【问题讨论】:

    标签: node.js cpu-usage


    【解决方案1】:

    在 *nix 系统上,可以通过读取 /proc/[pid]/stat 虚拟文件来获取进程统计信息。

    例如,这将每十秒检查一次 CPU 使用率,如果超过 20%,则打印到控制台。它通过检查进程使用的 cpu 滴答数并将该值与一秒后进行的第二次测量进行比较来工作。区别在于该进程在该秒内使用的滴答数。在 POSIX 系统上,每秒有 10000 个滴答声(每个处理器),因此除以 10000 得到一个百分比。

    var fs = require('fs');
    
    var getUsage = function(cb){
        fs.readFile("/proc/" + process.pid + "/stat", function(err, data){
            var elems = data.toString().split(' ');
            var utime = parseInt(elems[13]);
            var stime = parseInt(elems[14]);
    
            cb(utime + stime);
        });
    }
    
    setInterval(function(){
        getUsage(function(startTime){
            setTimeout(function(){
                getUsage(function(endTime){
                    var delta = endTime - startTime;
                    var percentage = 100 * (delta / 10000);
    
                    if (percentage > 20){
                        console.log("CPU Usage Over 20%!");
                    }
                });
            }, 1000);
        });
    }, 10000);
    

    【讨论】:

    • 是每个处理器还是每个处理器核心?
    【解决方案2】:

    尝试查看此代码:https://github.com/last/healthjs

    用于获取远程系统 CPU 并接收 CPU 使用率警报的网络服务...

    Health.js 提供 2 种主要模式:“流媒体模式”和“事件模式”。流式传输模式允许客户端连接和接收流式 CPU 使用数据。事件模式使 Health.js 在 CPU 使用率达到某个阈值时通知远程服务器。两种模式可以同时运行...

    【讨论】:

    • 这个好久没更新了,好像没用了。
    • 你没有因此而标记我......这不是我的错!我在一年前发表了这样的评论。
    • 答案会被标记,因此其他人不会将其称为真相,这与个人无关。
    • 如果你知道这个答案不再正确,你应该删除它。或者至少 OP 应该删除他的正确答案检查。
    • 这是如此,而不是 ServerFault...贡献代码或将其用作示例。
    【解决方案3】:

    您现在可以使用 os 模块了。

    var os = require('os');
    var loads = os.loadavg();
    

    这将为您提供过去 60 秒、5 分钟和 15 分钟的平均负载。 不过,这并没有给你 cpu 使用率。

    【讨论】:

    • 平均负载适用于整个系统。问题是关于获取当前进程的统计信息。
    • 注意!!在 Windows 上返回 [0,0,0]。
    • @origin1tech 在 Windows 上启用它使用来自 npm 的loadavg-windows
    【解决方案4】:

    请参阅node-usage 以跟踪进程 CPU 和内存使用情况(而非系统)

    【讨论】:

      【解决方案5】:

      使用节点process.cpuUsage函数(在节点v6.1.0中引入)。 它显示了 cpu 在您的节点进程上花费的时间。来自文档的示例:

      const previousUsage = process.cpuUsage();
      // { user: 38579, system: 6986 }
      
      // spin the CPU for 500 milliseconds
      const startDate = Date.now();
      while (Date.now() - startDate < 500);
      
      // At this moment you can expect result 100%
      // Time is *1000 because cpuUsage is in us (microseconds)
      const usage = process.cpuUsage(previousUsage);
      const result = 100 * (usage.user + usage.system) / ((Date.now() - startDate) * 1000) 
      console.log(result);
      
      // set 2 sec "non-busy" timeout
      setTimeout(function() {
          console.log(process.cpuUsage(previousUsage);
          // { user: 514883, system: 11226 }    ~ 0,5 sec
          // here you can expect result about 20% (0.5s busy of 2.5s total runtime, relative to previousUsage that is first value taken about 2.5s ago)
      }, 2000);
      

      【讨论】:

      • 他要求百分比,不过
      • @AmitB。要获得 % 使用一些简单的数学。您需要将结果除以度量之间经过的时间。 percentResult = 100 * (result.user + result.system) / ((timeOfCurrentDateNow - timeOfPreviousDateNow) * 1000)。时间乘以 1000 以将 ms 转换为 us - process.cpuUsage 在 us 中返回结果。请注意,这是在单个逻辑核心上运行的单个节点进程的结果。
      • process.cpuUsage 只返回经过了多少时间
      • @EvgenyKolyakov 是的,您可以使用它来计算特定时间段内的 cpu 使用率(在上述情况下,它会分析过去 500 毫秒内 CPU 在此进程上花费了多少时间。在此获取 %具体情况就够了usageInPercent = (usage.user + usage.system)/500.
      • 顺便说一句。 cpu 使用概念只有在某个时间窗口(例如最后一分钟或第二个)测量它的情况下才有意义
      【解决方案6】:

      另一种选择是使用node-red-contrib-os

      【讨论】:

        猜你喜欢
        • 2015-06-24
        • 2015-06-06
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多