🌟前言
哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们带领大家初识一下 Node内置模块 操作系统os模块 ;让我们一起来看看吧🤘
🌟os模块
os 模块提供了与操作系统相关的实用方法和属性
🌟使用
我们可以通过以下方式引入该模块:
var os = require("os")
🌟属性
属性名 | 描述 |
os.EOL | 返回操作系统特定的行末标志,可能返回的值为’\n’ |
🌟方法
🌟获取操作系统临时目录
os.tmpdir()该方法用于获取操作系统中默认的用于存放临时文件的目录。
os.tmpdir() // 输出:/var/folders/9c/cx_t8sf14rz625px11rj3pl40000gn/T
🌟获取操作系统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)
但在 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!