读了 os
模块的文档,研究了几个有意思的问题:javascript
🔍 关注公众号“心谭博客” / 👉 查看原文: xxoo521.com / 欢迎交流和指正
nodejs 提供了os.platform()
和os.type()
,能够用来识别操做系统平台。推荐使用: os.platform()
html
平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 cpu 使用率没有直接关系。前端
其中,这里的可运行状态指的是:正在使用 cpu 或正在等待 cpu 的进程。不可中断状态指的是:内核态关键流程中的进程。java
在 nodejs 中,直接调用os.loadavg()
能够得到 一、5 和 15 分钟的平均负载,它和 unix 命令uptime
返回值同样。node
为何须要关心平均负载这个问题呢?由于进程分为 2 种,第一种就是“CPU 密集型”,它的 cpu 使用率和平均负载都是高的;第二种是“IO 密集型”,它的 cpu 使用率不必定高,可是等待 IO 会形成平均负载高。因此,cpu 使用率和平均负载共同反应系统性能。算法
平均活跃进程数最理想的状态是 cpu 数量=平均负载,若是 cpu 数量 < 平均负载,那么平均负载太高。npm
// 判断是否平均负载太高 function isHighLoad() { const cpuNum = os.cpus().length; return os.loadavg().map(item => item > cpuNum); }
不少监控软件都提供针对 cpu 使用率的“实时”监控,固然这个实时不是真的实时,有个时间差。这个功能,nodejs 如何实现呢?api
第一步:封装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 使用率。ui
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(); }
process.uptime()
os.uptime()
专一前端与算法的系列干货分享,欢迎关注(¬‿¬)