如何使用 node.js 获取系统统计信息

Posted

技术标签:

【中文标题】如何使用 node.js 获取系统统计信息【英文标题】:How to get system statistics with node.js 【发布时间】:2012-05-07 03:14:49 【问题描述】:

我有一个分布式服务器系统。

有很多服务器,通过 PubSub 进行协调。 它们都连接到统计服务器。 服务器每分钟将其统计信息发送到统计服务器(处理了多少请求、平均时间等)。

所以...在此统计消息中包含系统状态会很好。 我需要 CPU 负载(每个内核)和可用内存量。

我做了一个小变通,决定用“exec”调用一个linux命令,解析答案并形成一个JSON数据进行发送。

但是我怎样才能从命令行获取这些数据呢?

在 Mac OS X 上,我可以使用 geektool 脚本轻松获得所需的一切,但在 linux (debian) 上它们不起作用。

例如:

top -l 1 | awk '/PhysMem/ print "Used: " $8 " Free: " $10'

在 Mac OS X Lion 上我得到:

Used: 3246M Free: 848M

而且只是 debian 中的一个错误...

【问题讨论】:

你试过 Dtrace 吗? mcavage.github.com/presentations/dtrace_conf_2012-04-03 github.com/sebhildebrandt/systeminformation ***.com/questions/26208454/… 【参考方案1】:

在 Linux 上,您可以使用 /proc。请参阅here 获取一系列命令行示例以读取统计信息。

最好直接从 Node 读取文件,使用fs.readFile()

更新: 还有可能更好的OS API。 用法示例:Convert the output of os.cpus() in Node.js to percentage

【讨论】:

非常感谢!找到了获得可用内存量的方法,但我仍然无法在每个内核上获得 CPU 负载。并且... /proc/loadavg 返回零。正常吗? 使用 os.loadavg();.它将以数组的形式返回服务器在 1 分钟、5 分钟和 15 分钟内的总负载。【参考方案2】:

恕我直言,最好的选择是使用systeminformation 模块,

您可以在其中检索具有 Linux、macOS、部分 Windows 和 FreeBSD 支持的详细硬件、系统和操作系统信息。

例如获取CPU信息:

const si = require('systeminformation');

// callback style
si.cpu(function(data) 
    console.log('CPU-Information:');
    console.log(data);
);

// promises style - new in version 3
si.cpu()
    .then(data => console.log(data))
    .catch(error => console.error(error));

// full async / await example (node >= 7.6)
async function cpu() 
    try 
        const data = await si.cpu();
        console.log(data)
     catch (e) 
        console.log(e)
    

此示例将产生以下结果:

 manufacturer: 'Intel®',
    brand: 'Core™ i5-3317U',
    vendor: 'GenuineIntel',
    family: '6',
    model: '58',
    stepping: '9',
    revision: '',
    voltage: '',
    speed: '1.70',
    speedmin: '0.80',
    speedmax: '2.60',
    cores: 4,
    cache:  l1d: 32768, l1i: 32768, l2: 262144, l3: 3145728  
CPU-Information:
 manufacturer: 'Intel®',
    brand: 'Core™ i5-3317U',
    vendor: 'GenuineIntel',
    family: '6',
    model: '58',
    stepping: '9',
    revision: '',
    voltage: '',
    speed: '1.70',
    speedmin: '0.80',
    speedmax: '2.60',
    cores: 4,
    cache:  l1d: 32768, l1i: 32768, l2: 262144, l3: 3145728  

【讨论】:

【参考方案3】:

您可以尝试os-usage,它是top 命令的包装器。

它提供诸如 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' 
);

// watch processes that use most cpu percentage
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'  ]
);

【讨论】:

【参考方案4】:

无耻的塞- https://www.npmjs.com/package/microstats

还可以配置为在磁盘空间、cpu 或内存超过用户定义的阈值时提醒用户。适用于 linux、macOS 和 windows。

【讨论】:

以上是关于如何使用 node.js 获取系统统计信息的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 linux/Mac OSX 中获取网络适配器统计信息?

获取 ext3 和其他文件系统的类似 nfsstat 的统计信息

如何获取 Linux/UNIX 上当前的网络接口吞吐量统计信息? [关闭]

如何以编程方式获取堆栈内存统计信息?

如何获取熊猫群的统计信息