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

23

有没有一种方式可以通过代码找出 Node.js 进程的 CPU 使用率。这样,当 Node.js 应用程序在服务器上运行并检测到 CPU 使用率超过某个百分比时,它将发出警报或输出到控制台。

6个回答

32

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

例如,以下代码每10秒检查一次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);

这是每个处理器还是每个处理器核心? - Matej

18

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

Health.js 是一个网络服务,可以获取远程系统的 CPU 使用情况并接收 CPU 使用警报...

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


1
这个已经很久没更新了,好像不再起作用了。 - Garrows
37
你不要因此打我分数低……这不是我的错!我是一年前发表的那个评论。 - CrazyDart
4
回答会被标记下来,这样其他人就不会把它们当作真相来参考,这与个人无关。 - Zack Bloom
1
如果您知道回答已经不再正确,请删除此答案。或者至少,OP应该取消对其正确答案的标记。 - Surender Thakran
6
这里是SO,不是ServerFault... 可以为代码做出贡献或将其用作示例。 - CrazyDart

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);

1
他要求百分比,虽然。 - Amit Beckenstein
3
要获得百分比,请进行一些简单的数学计算。您需要将结果除以两次测量之间经过的时间。百分比结果=100(结果.user + 结果.system)/((当前日期时间 - 上一个日期时间) 1000)。时间乘以1000转换为微秒,因为 process.cpuUsage 返回微秒结果。请注意,这是单个 Node 进程在单个逻辑核上运行的结果。 - fider
process.cpuUsage 只返回经过的时间。 - EvgenyKolyakov
@EvgenyKolyakov 是的,你可以使用这个来计算在某个时间段内的 CPU 使用率(在上面的例子中,它分析了 CPU 在最近 500 毫秒内花费多少时间在这个进程上)。在这种特定情况下,要得到百分比,只需执行 usageInPercent = (usage.user + usage.system)/500 即可。 - fider
顺便提一下,CPU使用率的概念只有在某个时间窗口内进行测量时才有意义(例如,最近一分钟或一秒钟)。 - fider

8
现在您可以使用os模块。
var os = require('os');
var loads = os.loadavg();

这个指令可以给你过去60秒、5分钟和15分钟的负载平均值。但是,它并不能告诉你CPU使用率的百分比。


2
负载平均值是针对整个系统的。问题是关于获取当前进程的统计数据。 - bluesmoon
7
注意!在Windows系统上返回[0,0,0]。 - origin1tech
@origin1tech 要在 Windows 上启用它,请使用npm中的 loadavg-windows - fider

7

请看node-usage,用于追踪进程的CPU和内存使用情况(不是系统)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接