讀了 os
模塊的文檔,研究了幾個有意思的問題:html
nodejs 提供了os.platform()
和os.type()
,能夠用來識別操做系統平臺。推薦使用: os.platform()
前端
平均負載是指:單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數。它和 cpu 使用率沒有直接關係。node
其中,這裏的可運行狀態指的是:正在使用 cpu 或正在等待 cpu 的進程。不可中斷狀態指的是:內核態關鍵流程中的進程。web
在 nodejs 中,直接調用os.loadavg()
能夠得到 一、5 和 15 分鐘的平均負載,它和 unix 命令uptime
返回值同樣。算法
爲何須要關心平均負載這個問題呢?由於進程分爲 2 種,第一種就是「CPU 密集型」,它的 cpu 使用率和平均負載都是高的;第二種是「IO 密集型」,它的 cpu 使用率不必定高,可是等待 IO 會形成平均負載高。因此,cpu 使用率和平均負載共同反應系統性能。npm
平均活躍進程數最理想的狀態是 cpu 數量=平均負載,若是 cpu 數量 < 平均負載,那麼平均負載太高。api
// 判斷是否平均負載太高
function isHighLoad() {
const cpuNum = os.cpus().length;
return os.loadavg().map(item => item > cpuNum);
}
不少監控軟件都提供針對 cpu 使用率的「實時」監控,固然這個實時不是真的實時,有個時間差。這個功能,nodejs 如何實現呢?frontend
第一步:封裝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 使用率,內存的指標有內存使用率。
藉助 nodejs 接口,實現很是簡單:
function getMemUsage() {
return 1 - os.freemem() / os.totalmem();
}
process.uptime()
os.uptime()