深入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(<span class="hljs-function" style="line-height: 26px;"><span class="hljs-params" style="line-height: 26px;">cpu</span> =&gt;</span> {
    <span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> { times } = cpu;
    user += times.user;
    nice += times.nice;
    sys += times.sys;
    idle += times.idle;
    irq += times.irq;
});

total = user + nice + sys + idle + irq;

<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">return</span> {
    total,
    idle
};

}

第二步:當前時間點 t1,選定一個時間差 intervel,計算 t1 和 t1 + interval 這兩個時間點的 cpu 時間差與空閑模式時間差,返回 1 - 空閑時間差 / cpu時間差。返回的結果就是時間差 intervel 內的平均 cpu 使用率。

function getCPUUsage(interval = 1000) {
    const startInfo = getCPUInfo();
<span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">return</span> <span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">new</span> <span class="hljs-built_in" style="color: #0086b3; line-height: 26px;">Promise</span>(<span class="hljs-function" style="line-height: 26px;"><span class="hljs-params" style="line-height: 26px;">resolve</span> =&gt;</span> {
    setTimeout(<span class="hljs-function" style="line-height: 26px;"><span class="hljs-params" style="line-height: 26px;">()</span> =&gt;</span> {
        <span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> endInfo = getCPUInfo();

        <span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> idleDiff = startInfo.idle - endInfo.idle;
        <span class="hljs-keyword" style="color: #333; font-weight: bold; line-height: 26px;">const</span> totalDiff = startInfo.total - endInfo.total;
        resolve(<span class="hljs-number" style="color: #008080; line-height: 26px;">1</span> - <span class="hljs-built_in" style="color: #0086b3; line-height: 26px;">Math</span>.abs(idleDiff / totalDiff));
    }, interval);
});

}

使用方式如下:

getCPUUsage().then(usage => console.log("cpu使用率:", usage));

理解和計算“內存使用率”

cpu 的指標有平均負載、cpu 使用率,內存的指標有內存使用率。

借助 nodejs 接口,實現非常簡單:

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

查看運行時間

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

參考鏈接

放在最后

  1. 覺得不錯, 幫忙點個推薦唄,您的支持是對我最大的激勵
  2. 歡迎我的公眾號: 「心譚博客」,只專注於 前端 + 算法的原創分享

由於個人精力有限,很多系列和歷史文章沒有即時同步,請前往「前端圖譜」&「算法題解」,保證您有所收獲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM