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

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

我的代码:

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

我希望将“times”指标转换为百分比,就像在iostat命令中显示的那样:

  cpu us sy id 6 3 91 

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

谢谢。

根据文件 , times

一个包含用户,nice,sys,idle和irq的CPU ticks数量的对象

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

 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可以select定期更新,显示自上次更新以来的平均使用情况。 汤姆的方法可以很好的实施。

这个模块,可以使用NPM进行安装,提供了您所需要的:

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

调用cpuUsage(callback)方法,你将得到你所需要的。

如果您正在查看每个进程的CPU使用情况,请尝试节点使用情况

一个简单的黑客:

 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() } 

你可以使用一个像https://github.com/felixge/node-measured这样的度量库来探测更多的东&#x897F;

这是我的解决scheme

时间间隔在几秒钟内。

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秒输出一次这样的数据

 [ { 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推入到我的stream程图;)

我使用这个代码:

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

如果你想观看实时的CPU和内存使用情况,你可以尝试使用操作系统 。

基本用法如下:

 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' } ] }); 

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

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