文章目录
- 🌟前言
- 🌟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!
✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!