将Node.js中os.cpus()的输出转换为百分比

rog*_*pvl 16 cpu operating-system node.js

有没有办法将os.cpus()信息转换为百分比?就像iostat的输出一样(在CPU部分).

我的代码:

var os = require('os');
console.log(os.cpus());
Run Code Online (Sandbox Code Playgroud)

输出:

[ { model: 'MacBookAir4,2',
    speed: 1800,
    times: 
     { user: 5264280,
       nice: 0,
       sys: 4001110,
       idle: 58703910,
       irq: 0 } },
  { model: 'MacBookAir4,2',
    speed: 1800,
    times: 
     { user: 2215030,
       nice: 0,
       sys: 1072600,
       idle: 64657440,
       irq: 0 } },
  { model: 'MacBookAir4,2',
    speed: 1800,
    times: 
     { user: 5973360,
       nice: 0,
       sys: 3197990,
       idle: 58773760,
       irq: 0 } },
  { model: 'MacBookAir4,2',
    speed: 1800,
    times: 
     { user: 2187650,
       nice: 0,
       sys: 1042550,
       idle: 64714820,
       irq: 0 } } ]
Run Code Online (Sandbox Code Playgroud)

我希望将"时间"指标转换为百分比,就像在iostat命令中显示一样:

  cpu
us sy id
6  3 91
Run Code Online (Sandbox Code Playgroud)

我知道nodejs函数中的值是在CPU滴答声中,但我不知道应该使用什么公式将它们转换为百分比:)

谢谢.

Lin*_*iel 32

根据文档,times

包含在以下内容中花费的CPU滴答数的对象:user,nice,sys,idle和irq

所以你应该能够总结时间并计算百分比,如下所示:

var cpus = os.cpus();

for(var i = 0, len = cpus.length; i < len; i++) {
    console.log("CPU %s:", i);
    var cpu = cpus[i], total = 0;

    for(var type in cpu.times) {
        total += cpu.times[type];
    }

    for(type in cpu.times) {
        console.log("\t", type, Math.round(100 * cpu.times[type] / total));
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如Tom Frost在评论中所说,这是自系统启动以来的平均使用率.这与问题是一致的,因为同样如此iostat.但是,iostat可以选择定期更新,显示自上次更新以来的平均使用情况.汤姆的方法可以很好地实现它.

  • 值得注意的是,这仅仅为您提供自机器上次启动以来的平均使用时间.如果您运行空闲一周并且峰值达到100%CPU使用率,则此脚本仍将显示机器几乎空闲.更好的方法可能是使用setTimeout在第二次或第二次等待之前和之后测量统计数据,从结束标记中减去开始标记,然后对其进行计算. (15认同)

osc*_*arm 6

该模块可以使用NPM安装,提供您所需的功能:

https://github.com/oscmejia/os-utils

调用cpuUsage(回调)方法,您将获得所需的内容.


use*_*777 6

这是我的解决方案

间隔以秒为单位。

10将计算过去10秒的负载!

var _  = require("underscore");
var os = require("os"); 
var interval = 1;
var old = _.map(os.cpus(),function(cpu){ return cpu.times;})

setInterval(function() {
    var result = [];
    var current = _.map(os.cpus(),function(cpu){ return cpu.times; })
    _.each(current, function(item,cpuKey){
        result[cpuKey]={}

        var oldVal = old[cpuKey];
        _.each(_.keys(item),function(timeKey){
            var diff = (  parseFloat((item[timeKey]) - parseFloat(oldVal[timeKey])) / parseFloat((interval*100)));
            var name = timeKey;
            if(timeKey == "idle"){
                name = "CPU"        
                diff = 100 - diff;
            }
            //console.log(timeKey + ":\t" + oldVal[timeKey] + "\t\t" + item[timeKey] + "\t\t" + diff);  
            result[cpuKey][name]=diff.toFixed(0);
        });
    });
    console.log(result);
    old=current;
}, (interval * 1000));
Run Code Online (Sandbox Code Playgroud)

在我的 8 核上每 n 秒输出类似这样的内容

[ { user: '82', nice: '0', sys: '18', CPU: '100', irq: '0' },
  { user: '1', nice: '0', sys: '1', CPU: '3', irq: '0' },
  { user: '1', nice: '0', sys: '1', CPU: '3', irq: '0' },
  { user: '9', nice: '0', sys: '2', CPU: '11', irq: '0' },
  { user: '1', nice: '0', sys: '0', CPU: '1', irq: '0' },
  { user: '1', nice: '0', sys: '1', CPU: '2', irq: '0' },
  { user: '1', nice: '0', sys: '2', CPU: '2', irq: '0' },
  { user: '1', nice: '0', sys: '2', CPU: '3', irq: '0' } ]
Run Code Online (Sandbox Code Playgroud)

通过 socket.io 将其推送到我的流程图中;)