深入NodeJS模块os - 与操作系统“打交道”
2021-04-22 19:29
读了 nodejs 提供了 平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 cpu 使用率没有直接关系。 其中,这里的可运行状态指的是:正在使用 cpu 或正在等待 cpu 的进程。不可中断状态指的是:内核态关键流程中的进程。 在 nodejs 中,直接调用 为什么需要关心平均负载这个问题呢?因为进程分为 2 种,第一种就是“CPU 密集型”,它的 cpu 使用率和平均负载都是高的;第二种是“IO 密集型”,它的 cpu 使用率不一定高,但是等待 IO 会造成平均负载高。所以,cpu 使用率和平均负载共同反应系统性能。 平均活跃进程数最理想的状态是 cpu 数量=平均负载,如果 cpu 数量
很多监控软件都提供针对 cpu 使用率的“实时”监控,当然这个实时不是真的实时,有个时间差。这个功能,nodejs 如何实现呢? 第一步:封装 第二步:当前时间点 t1,选定一个时间差 intervel,计算 t1 和 t1 + interval 这两个时间点的 cpu 时间差与空闲模式时间差,返回 使用方式如下: cpu 的指标有平均负载、cpu 使用率,内存的指标有内存使用率。 借助 nodejs 接口,实现非常简单: 由于个人精力有限,很多系列和历史文章没有即时同步,请前往「前端图谱」&「算法题解」,保证您有所收获。os
模块的文档,研究了几个有意思的问题:
识别操作系统平台
os.platform()
和os.type()
,可以用来识别操作系统平台。推荐使用: os.platform()
理解和计算“平均负载”
os.loadavg()
可以获得 1、5 和 15 分钟的平均负载,它和 unix 命令uptime
返回值一样。// 判断是否平均负载过高
function isHighLoad() {
const cpuNum = os.cpus().length;
return os.loadavg().map(item => item > cpuNum);
}
理解和计算“cpu 使用率”
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
};
}
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));
理解和计算“内存使用率”
function getMemUsage() {
return 1 - os.freemem() / os.totalmem();
}
查看运行时间
process.uptime()
os.uptime()
参考链接
放在最后
文章标题:深入NodeJS模块os - 与操作系统“打交道”
文章链接:http://soscw.com/index.php/essay/78216.html