1. 程式人生 > 實用技巧 >NodeJS模組os

NodeJS模組os

讀了os模組的文件,研究了幾個有意思的問題:

  • 識別作業系統平臺
  • 理解和計算“平均負載”
  • 理解和計算“cpu 使用率”
  • 理解和計算“記憶體使用率”
  • 檢視執行時間

識別作業系統平臺

nodejs提供了os.platform()和os.type(),可以用來識別作業系統平臺。推薦使用:os.platform()

理解和計算“平均負載”

平均負載是指:單位時間內,系統處於可執行狀態和不可中斷狀態的平均程序數。它和 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));

佛山vi設計https://www.houdianzi.com/fsvi/ 豌豆資源搜尋大全https://55wd.com

理解和計算“記憶體使用率”

cpu 的指標有平均負載、cpu 使用率,記憶體的指標有記憶體使用率。

藉助 nodejs 介面,實現非常簡單:

function getMemUsage() {
    return 1 - os.freemem() / os.totalmem();
}

檢視執行時間

  • nodejs 執行時間:process.uptime()
  • 系統執行時間:os.uptime()