2012-03-05 75 views
8

是否有将os.cpus()信息转换为百分比的方法?就像iostat的输出(在CPU部分)。将Node.js中os.cpus()的输出转换为百分比

我的代码:

var os = require('os'); 
console.log(os.cpus()); 

输出:

[ { 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 } } ] 

我想有 “泰晤士报” 公制转换为百分比,就像是表演的iostat命令:

cpu 
us sy id 
6 3 91 

我知道nodejs函数中的值在CPU ticks中,但我没有ide我应该使用什么公式将它们转换为百分比:)

谢谢。

回答

28

the docstimes

包含CPU的数目的对象蜱花:用户,美观大方,SYS,空闲和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)); 
    } 
} 

编辑:正如Tom Frost在评论中所说,这是系统启动后的平均使用率。这与问题一致,因为iostat也是如此。但是,iostat有做定期更新,以显示自上次更新平均使用的选项。汤姆的方法对于实现这一点很有效。

+0

这就是它!这是我正在寻找的公式。谢谢:) – rogeriopvl 2012-03-05 14:20:30

+0

不能相信我错过了操作系统* API在看时: - /你去那应该是你需要的一切。 – w00t 2012-04-26 13:08:16

+12

值得注意的是,这只会给你自上次启动机器后的平均使用时间。如果您闲置一周并且达到100%CPU使用率,则此脚本仍将显示机器几乎空闲。一个更好的方法可能是使用setTimeout来测量一两次或两次等待之前和之后的统计数据,从结束滴答数据中减去开始滴答数据,然后对其进行计算。 – 2012-07-10 19:29:12

4

如果您正在寻找在每个进程的CPU占用率尽量node-usage

2

一个简单的黑客:

var os = require('os') 
var samples = [] 
var prevCpus = os.cpus() 

setInterval(sample,100) 
setInterval(print,1000) 

function print() { 
    var result = {last10:null, last50:null, last100:null} 
    var percent = 0 
    var i = samples.length 
    var j = 0 
    while (i--) { 
    j++ 
    if (samples[i].total > 0) 
     percent += (100 - Math.round(100 * samples[i].idle/samples[i].total)) 
    if (j == 10)  result.last10 = percent/j 
    else if (j == 50) result.last50 = percent/j  
    else if (j == 100) result.last100 = percent/j 
    } 
    console.log(result) 
} 

function sample() { 
    currCpus = os.cpus() 
    for (var i=0,len=currCpus.length;i<len;i++) { 
    var prevCpu = prevCpus[i] 
    var currCpu = currCpus[i] 
    var deltas = {total:0} 
    for (var t in prevCpu.times) 
     deltas.total += currCpu.times[t] - prevCpu.times[t] 
    for (var t in prevCpu.times) 
     deltas[t] = currCpu.times[t] - prevCpu.times[t] 
    } 
    prevCpus = currCpus 
    samples.push(deltas) 
    if (samples.length>100) samples.shift() 
} 

你可以使用一个指标,LIB像https://github.com/felixge/node-measured下探东西更丰富

0

我使用此代码:

var cpu_used = function(){ 
var cpu = os.cpus(); 

var counter = 0; 
var total=0; 

var free=0; 
var sys=0; 
var user=0; 

for (var i = 0; i<cpu.length ; i++) { 

    counter++; 
    total=parseFloat(cpu[i].times.idle)+parseFloat(cpu[i].times.sys)+parseFloat(cpu[i].times.user)+parseFloat(cpu[i].times.irq)+parseFloat(cpu[i].times.nice); 

    free+=100*(parseFloat(cpu[i].times.idle)/total); 
    sys+=100*(parseFloat(cpu[i].times.sys)/total); 
    user+=100*(parseFloat(cpu[i].times.user)/total); 
}; 

console.log('CPU %s : %s + %s + %s',i,(free/counter),(user/counter),(sys/counter)); 

} 
2

这是我的解决方案

间隔以秒。

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

输出这样的事情在我的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' } ] 

通过socket.io到我流的图表按下此;)

+0

注意:我将“idle”改为“CPU”并从100中减去。 所以你有80%的CPU使用率。我宁愿20%闲置 – user3575777 2014-06-04 17:50:21

0

如果你想观看实时CPU和内存使用情况,可以尝试os-usage

的基本用法是类似以下内容:

var usage = require('os-usage'); 

// create an instance of CpuMonitor 
var cpuMonitor = new usage.CpuMonitor(); 

// watch cpu usage overview 
cpuMonitor.on('cpuUsage', function(data) { 
    console.log(data); 

    // { user: '9.33', sys: '56.0', idle: '34.66' } 
}); 

您还可以使用大部分CPU资源的过程:

cpuMonitor.on('topCpuProcs', function(data) { 
    console.log(data); 

    // [ { pid: '21749', cpu: '0.0', command: 'top' }, 
    // { pid: '21748', cpu: '0.0', command: 'node' }, 
    // { pid: '21747', cpu: '0.0', command: 'node' }, 
    // { pid: '21710', cpu: '0.0', command: 'com.apple.iCloud' }, 
    // { pid: '21670', cpu: '0.0', command: 'LookupViewServic' } ] 
}); 
0

在这里,我是如何做到的:

var OS = require('os'); 
var oldCPUTime = 0 
var oldCPUIdle = 0 
function getLoad(){ 
    var cpus = OS.cpus() 
    var totalTime = -oldCPUTime 
    var totalIdle = -oldCPUIdle 
    for(var i = 0; i < cpus.length; i++) { 
     var cpu = cpus[i] 
     for(var type in cpu.times) { 
      totalTime += cpu.times[type]; 
      if(type == "idle"){ 
       totalIdle += cpu.times[type]; 
      } 
     } 
    } 

    var CPUload = 100 - Math.round(totalIdle/totalTime*100)) 
    oldCPUTime = totalTime 
    oldCPUIdle = totalIdle 

    return { 
     CPU:CPUload, 
     mem:100 - Math.round(OS.freemem()/OS.totalmem()*100) 
    }  
}