读了 os
模块的文档,研究了几个有意思的问题:
- 🤔 理解和计算“平均负载”
- 🤔 理解和计算“cpu 使用率”
- 🤔 理解和计算“内存使用率”
- 🤔 识别操作系统平台
常用指标
- 操作系统:提供了
os.platform()
和os.type()
,可以用来识别操作系统平台。推荐使用:os.platform()
- 运行时间:
- nodejs 运行时间:
process.uptime()
- 系统运行时间:
os.uptime()
- nodejs 运行时间:
- 常用路径
- 系统(windows/macos)空设备:
os.devNull
- 当前用户主路径:
os.homedir()
- 系统临时文件目录:
os.tmpdir()
- 系统(windows/macos)空设备:
- 进程调度优先级
- 查询指定进程优先级:
os.getPriority([pid])
- 修改指定/当前进程优先级:
os.setPriority([pid, ]priority)
- 查询指定进程优先级:
理解和计算“平均负载”
什么是平均负载?
平均负载是指:单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它和 cpu 使用率没有直接关系。
以上图为例,假设是单CPU单内核系统,那么当CPU任务(图中的小车)不多的时候,就是Load < 1,依次类推到 Load = 1 、 Load > 1
对于多核CPU,那么一个CPU就有2条路,那么当Load = 2(大于1)的时候,系统也不会卡顿。
如何查看平均负载?
在 nodejs 中,直接调用os.loadavg()
可以获得 1、5 和 15 分钟的平均负载,它和 unix 命令uptime
返回值一样。
为什么需要关心平均负载呢?
因为进程分为 2 种,第一种就是“CPU 密集型”,它的 cpu 使用率和平均负载都是高的;第二种是“IO 密集型”,它的 cpu 使用率不一定高,但是等待 IO 会造成平均负载高。
所以,cpu 使用率和平均负载共同反应系统性能。
如何判断平均负载是否过高?
平均活跃进程数最理想的状态是 cpu 数量 = 平均负载
,如果 cpu 数量 < 平均负载
,那么平均负载过高。
1 | // 判断是否平均负载过高 |
理解和计算“cpu 使用率”
很多监控软件都提供针对 cpu 使用率的“实时”监控,当然这个实时不是真的实时,有个时间差。这个功能,nodejs 如何实现呢?
第一步:封装getCPUInfo()
,计算获取 cpu 花费的总时间与空闲模式花费的时间。
1 | /** |
第二步:当前时间点 t1,选定一个时间差 intervel,计算 t1 和 t1 + interval 这两个时间点的 cpu 时间差与空闲模式时间差,返回 1 - 空闲时间差 / cpu时间差
。返回的结果就是时间差 intervel 内的平均 cpu 使用率。
同时,空闲时间差 / cpu时间差
就是空闲率。
1 | function getCPUUsage(interval = 1000) { |
使用方式如下:
1 | getCPUUsage().then(usage => console.log("cpu使用率:", usage)); |
理解和计算“内存使用率”
cpu 的指标有平均负载、cpu 使用率,内存的指标有内存使用率。
借助 nodejs 接口,实现非常简单:
1 | function getMemUsage() { |