如何找出Node.js进程的%CPU使用率?

mur*_*lai 20 cpu-usage node.js

有没有办法找到node.js进程的%cpu使用情况与代码?这样当node.js服务器运行并检测到CPU超过某个%时,它就会发出警报或控制台输出.

Zac*_*oom 28

在*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);
Run Code Online (Sandbox Code Playgroud)


Cra*_*art 17

试着看看这段代码:https://github.com/last/healthjs

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

Health.js提供2种主要模式:"流模式"和"事件模式".流模式允许客户端连接和接收流式CPU使用数据.事件模式使Health.js能够在CPU使用率达到特定阈值时通知远程服务器.两种模式都可以同时运行......

  • 你不要因为它而标记我......这不是我的错!我在一年前做了那个评论. (28认同)
  • 这是SO,而不是ServerFault ...贡献代码或使用它作为示例. (5认同)
  • 答案被标记下来,所以其他人不会将它们称为真理,这不是个人的. (4认同)

fid*_*der 8

使用node process.cpuUsage函数(在node 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);
Run Code Online (Sandbox Code Playgroud)

  • @阿米特B。要获得%,请使用一些简单的数学。您需要将结果除以测量之间经过的时间。百分比结果 = 100 * (结果.用户 + 结果.系统) / ((当前日期时间 - 上一个日期时间) * 1000)。将时间乘以 1000 将 ms 转换为 us - process.cpuUsage 返回 us 中的结果。请注意,这是在单个逻辑核心上运行的单个节点进程的结果。 (3认同)

Gar*_*ows 7

您现在可以使用os模块.

var os = require('os');
var loads = os.loadavg();
Run Code Online (Sandbox Code Playgroud)

这为您提供了最后60秒,5分钟和15分钟的平均负载.虽然这并没有给你cpu的使用率.

  • 注意!!在Windows上返回[0,0,0]. (5认同)
  • 平均负载是针对整个系统的。问题是关于获取当前进程的统计信息。 (2认同)

Aru*_*ala 7

请参阅用于跟踪进程CPU和内存使用情况的节点用法(不是系统)