> 文章列表 > Node内置模块 【操作系统os模块】

Node内置模块 【操作系统os模块】

Node内置模块 【操作系统os模块】

文章目录

  • 🌟前言
  • 🌟os模块
  • 🌟使用
  • 🌟属性
  • 🌟方法
    • 🌟获取操作系统临时目录
    • 🌟获取操作系统主机名
    • 🌟获取操作系统CPU架构
    • 🌟识别操作系统平台
    • 🌟获取操作系统发行版本
    • 🌟理解和计算“平均负载”
    • 🌟理解和计算“cpu 使用率
    • 🌟理解和计算“内存使用率”
    • 🌟获取CPU信息
      • 🌟获取CPU核心数及CPU信息:
    • 🌟查看运行时间
      • 🌟nodejs 运行时间
      • 🌟系统运行时间
    • 🌟查看网络接口列表
  • 🌟写在最后


在这里插入图片描述

🌟前言

哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识一下 Node内置模块 操作系统os模块 ;让我们一起来看看吧🤘

🌟os模块

os 模块提供了与操作系统相关的实用方法和属性

🌟使用

我们可以通过以下方式引入该模块:

var os = require("os")

🌟属性

属性名 描述
os.EOL 返回操作系统特定的行末标志,可能返回的值为’\\n’

🌟方法

方法 描述
os.tmpdir() 该方法用于获取操作系统中默认的用于存放临时文件的目录。
os.endianness() 该方法用于获取CPU的字节序(endianness),可能返回的值为“BE” 或 “LE”。
os.hostname() 该方法用于返回操作系统的主机名。
os.type() 该方法用于获取操作系统类型。在 Linux 上返回 ‘Linux’,在 macOS 上返回 ‘Darwin’,在 Windows 上返回 ‘Windows_NT’。
os.platform() 该方法用于获取操作系统平台,可能返回的值为’darwin’、‘linux’、‘win32’
os.arch() 该方法用于获取操作系统 CPU 架构,可能的值有 “x64”、“arm” 和 “ia32”。
os.release() 该方法用于获取操作系统的发行版本。
os.uptime() 该方法用于获取系统的当前运行时间,单位为秒。
os.loadavg() 该方法返回一个数组,其中存放了1分钟、5分钟及15分钟的系统平均负载。
os.totalmem() 该方法返回系统的总内存量,单位为字节。
os.freemem() 该方法返回系统的空闲内存量,单位为字节。
os.cpus() 该方法返回一个数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象)。
os.networkInterfaces() 该方法返回一个数组,其中存放了系统中的所有网络接口。

🌟获取操作系统临时目录

os.tmpdir()该方法用于获取操作系统中默认的用于存放临时文件的目录。

os.tmpdir()
// 输出:/var/folders/9c/cx_t8sf14rz625px11rj3pl40000gn/T

🌟获取操作系统主机名

os.hostname() 该方法用于返回操作系统的主机名。

os.hostname()
// 输出:allcky-2.local

🌟获取操作系统CPU架构

CPU架构是CPU商给CPU产品定的一个规范,主要目的是为了区分不同类型的CPU。目前市场上的CPU分类主要分有两大阵营,一个是intel、AMD为首的复杂指令集CPU,另一个是以IBM、ARM为首的精简指令集CPU。不同品牌的CPU,其产品的架构也不相同,Intel、AMD的CPU是X86架构,IBM公司的CPU是PowerPC架构,ARM公司的CPU是ARM架构,国内的飞腾CPU也是ARM架构。此外还有MPIS架构、SPARC架构、Alpha架构。

  • X86架构: X86架构(The X86 architecture)是微处理器执行的计算机语言指令集。x86架构CPU主要应用领域:个人计算机、服务器等。在PC端市场Wintel组合(windows系统 + intel处理器)占据了大部分江山,另外一部分有ADM占领。而x64的全称叫x86-64,也就是说x64是x86架构的64位cpu。
  • ARM架构:ARM架构,也称作进阶精简指令集机器,是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。ARM架构主要应用领域:手机端CPU和MCU,手机CPU市场,由高通骁龙系列、华为麒麟系列、以及三星猎户系列和联发科系列,

🌟识别操作系统平台

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

  • os.platform()该方法用于获取操作系统平台,可能返回的值为’darwin’、‘linux’、‘win32’
  • os.type()该方法用于获取操作系统类型。在 Linux 上返回 ‘Linux’,在 macOS 上返回 ‘Darwin’,在 Windows 上返回 ‘Windows_NT’。

推荐使用os.platform():

let platforms = {darwin:'MacOSX',linux:'Linux','win32':'Windows'}
let type = os.platform()
// 获取Platform    当前:darwin
platforms[type]   
//输出:MacOSX

🌟获取操作系统发行版本

os.release() 该方法用于获取操作系统的发行版本。

在Windows系统获取操作系统发行版本:

const release = os.release();  // 输出:6.3     主版本.次版本
console.log(release)
版本 主版本.次版本
Windows 10, Windows Server 2016 10.0
Windows 8.1, Windows Server 2012 R2 6.3
Windows 8, Windows Server 2012 6.2
Windows 7, Windows Server 2008 R2 6.1
Windows Vista, Windows Server 2008 6.0
Windows XP Professional x64 Edition, 5.2

但在 MacOSX 上,os.release()得到的结果不准确,建议采用以下方式:

const { execSync } = require('child_process')
const macVersion = execSync('sw_vers -productVersion', { encoding: 'utf-8' })
console.log(release)
//输出:12.1

🌟理解和计算“平均负载”

平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 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 使用率,内存的指标有内存使用率。

// 返回系统的总内存量,单位为字节
os.totalmem()
// 返回系统的空闲内存量,单位为字节
os.freemem()

借助 nodejs 接口,实现内存使用率:

/*** 获取内存使用率* @returns 内存使用率*/
function getMemUsage() {return 1 - os.freemem() / os.totalmem();
}
/*** 将字节转换为其他类型值* @param {*} size 转换字节数* @param {*} type 转换目标,可用类型 kb,mb,gb* @returns 转换后的大小*/
function byteTo(size,type='kb') {var rules = {kb: 1024,mb: 1024 * 1024,gb: 1024 * 1024 * 1024}return size / rules[type]
}byteTo(getMemUsage(),'mb')   // 内存使用率 输出: xxMB

🌟获取CPU信息

os.cpus() 该方法返回一个数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象)。

console.log(os.cpus())

输出结果:

[{model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',speed: 2700,times: { user: 18665060, nice: 0, sys: 11753350, idle: 33536690, irq: 0 }},{model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',speed: 2700,times: { user: 9616620, nice: 0, sys: 5249430, idle: 49073350, irq: 0 }},{model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',speed: 2700,times: { user: 17431130, nice: 0, sys: 10963700, idle: 35544600, irq: 0 }},{model: 'Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz',speed: 2700,times: { user: 8412530, nice: 0, sys: 4786440, idle: 50740410, irq: 0 }}
]

🌟获取CPU核心数及CPU信息:

console.log('CPU核心数量:',os.cpus().length) // 输出:4
console.log('CPU信息:',os.cpus()[0].model)  // 输出:Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz

🌟查看运行时间

🌟nodejs 运行时间

process.uptime()

🌟系统运行时间

os.uptime()

🌟查看网络接口列表

获得网络接口列表的方法如下所示:

os.networkInterfaces()
{lo: [{address: '127.0.0.1',netmask: '255.0.0.0',family: 'IPv4',mac: '00:00:00:00:00:00',internal: true},{address: '::1',netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',family: 'IPv6',mac: '00:00:00:00:00:00',internal: true}],eth0: [{address: '192.168.1.108',netmask: '255.255.255.0',family: 'IPv4',mac: '01:02:03:0a:0b:0c',internal: false},{address: 'fe80::a00:27ff:fe4e:66a1',netmask: 'ffff:ffff:ffff:ffff::',family: 'IPv6',mac: '01:02:03:0a:0b:0c',internal: false}]
}

🌟写在最后

更多Node知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!