专栏首页YuanXinNodeJS模块研究 - os

NodeJS模块研究 - os

读了 os 模块的文档,研究了几个有意思的问题:

  • ? 识别操作系统平台
  • ? 理解和计算“平均负载”
  • ? 理解和计算“cpu 使用率”
  • ? 理解和计算“内存使用率”
  • ? 查看运行时间

识别操作系统平台

nodejs 提供了os.platform()os.type(),可以用来识别操作系统平台。推荐使用: os.platform()

理解和计算“平均负载”

平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 cpu 使用率没有直接关系。

其中,这里的可运行状态指的是:正在使用 cpu 或正在等待 cpu 的进程。不可中断状态指的是:内核态关键流程中的进程。

在 nodejs 中,直接调用os.loadavg()可以获得 1、5 和 15 分钟的平均负载,它和 unix 命令uptime返回值一样。

为什么需要关心平均负载这个问题呢?因为进程分为 2 种,第一种就是“CPU 密集型”,它的 cpu 使用率和平均负载都是高的;第二种是“IO 密集型”,它的 cpu 使用率不一定高,但是等待 IO 会造成平均负载高。所以,cpu 使用率和平均负载共同反应系统性能。

平均活跃进程数最理想的状态是 cpu 数量=平均负载,如果 cpu 数量 < 平均负载,那么平均负载过高。

// 判断是否平均负载过高
function isHighLoad() {
    const cpuNum = os.cpus().length;
    return os.loadavg().map(item => item > cpuNum);
}

理解和计算“cpu 使用率”

很多监控软件都提供针对 cpu 使用率的“实时”监控,当然这个实时不是真的实时,有个时间差。这个功能,nodejs 如何实现呢?

第一步:封装getCPUInfo(),计算获取 cpu 花费的总时间与空闲模式花费的时间。

/**
 * 获取cpu花费的总时间与空闲模式的时间
 */
function getCPUInfo() {
    const cpus = os.cpus();
    let user = 0,
        nice = 0,
        sys = 0,
        idle = 0,
        irq = 0,
        total = 0;

    cpus.forEach(cpu => {
        const { times } = cpu;
        user += times.user;
        nice += times.nice;
        sys += times.sys;
        idle += times.idle;
        irq += times.irq;
    });

    total = user + nice + sys + idle + irq;

    return {
        total,
        idle
    };
}

第二步:当前时间点 t1,选定一个时间差 intervel,计算 t1 和 t1 + interval 这两个时间点的 cpu 时间差与空闲模式时间差,返回 1 - 空闲时间差 / cpu时间差。返回的结果就是时间差 intervel 内的平均 cpu 使用率。

function getCPUUsage(interval = 1000) {
    const startInfo = getCPUInfo();

    return new Promise(resolve => {
        setTimeout(() => {
            const endInfo = getCPUInfo();

            const idleDiff = startInfo.idle - endInfo.idle;
            const totalDiff = startInfo.total - endInfo.total;
            resolve(1 - Math.abs(idleDiff / totalDiff));
        }, interval);
    });
}

使用方式如下:

getCPUUsage().then(usage => console.log("cpu使用率:", usage));

理解和计算“内存使用率”

cpu 的指标有平均负载、cpu 使用率,内存的指标有内存使用率。

借助 nodejs 接口,实现非常简单:

function getMemUsage() {
    return 1 - os.freemem() / os.totalmem();
}

查看运行时间

  • nodejs 运行时间:process.uptime()
  • 系统运行时间:os.uptime()

参考链接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 剑指offer - 把数字翻译成字符串 - JavaScript

    题目描述:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个...

    心谭博客
  • 让我们再聊聊Promise的实现

    关于 Promise 的实现网上已经有很多文章,最推荐的是这篇《史上最易读懂的 Promise/A+ 完全实现》。但其中then实现的部分代码中有些小问题。

    心谭博客
  • 【剑指offer:圆圈中最后剩下的数字】JavaScript实现

    题目描述:0,1,,n-1 这 n 个数字排成一个圆圈,从数字 0 开始,每次从这个圆圈里删除第 m 个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2...

    心谭博客
  • 当你 ping 的时候,你知道背后发生了什么吗?

    对于 ping命令,想必只要是程序员都知道吧?当我们检查网络情况的时候,最先使用的命令肯定是 ping命令吧?一般我们用 ping查看网络情况,主要是检查两个指...

    挨踢小子部落阁
  • Dimple在左耳听风ARTS打卡(十八)

    21天写作课在上周日已经结束了,21天不是结束,而是一个新的开始。所以,在往后的日子里,我还是会继续通过学到的知识,来更好地写文章。

    程序员小跃
  • 1.1.4 计算机网络的分类

    广域网的任务是提供长距离通信。运送主机所发送的数据,其覆盖范围通常为几十到几千千米的区域,因而有时也称为远程网。广域网是因特网的核心部分。连续广域网的各结点交换...

    week
  • javafx框架tornadofx实战-舒尔特4-左侧列表数据构建函数变更

    用户6167008
  • rop练习--split

    这里只是一道简单的栈溢出问题,但是因为设置NX,所以要通过rop来执行shellcode。 参考链接:https://medium.com/@iseethiev...

    0x222进制
  • Arduino 入门项目系列 (3) - 超声波距离检测警报器

    这周主要学习的是蜂鸣器和超声波传感器的使用,超声波传感器在智能小车上会有很多的用处。后来结合了 LCD 的使用,搭建了简易的距离检测警报器。

    caoqi95
  • 看这个天才老爸如何用Jetson NANO做一个带娃机器人

    这位细心的爸爸发现,虽然宝宝还不太会说话,但特别喜欢指着一些图案试图跟爸爸妈妈说这是什么,比如电视录像里的动物、海报上的食物,画册上的卡通图案。

    GPUS Lady

扫码关注云+社区

领取腾讯云代金券