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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 包

【讨论】:

以上是关于如何找出 Node.js 进程的 % CPU 使用率?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 以 CPU 核心为目标

Node.js 多进程

Node.js 进程在 AWS Fargate 中的行为如何?

走进Node.js之多进程模型

系列3|走进Node.js之多进程模型

Node.js的进程管理