怎么獲取Node性能監控指標?獲取方法分享

怎么獲取Node性能監控指標?本篇文章來和大家聊聊Node性能監控指標獲取方法 , 希望對大家有所幫助!

怎么獲取Node性能監控指標?獲取方法分享

文章插圖

最近在學習nodejs監控的知識 , 雖然沒有精力去學習寫一個簡易版監控 , 但還是忍不住了解一下如何獲取這些指標(查閱了很多資料 , 覺得國內網上對于這塊內容介紹是在太少了 , 自己也在整理服務端node知識點 , 就匯總為此文章 , 與君共享) 。
本文有些指標可能存在問題 , 歡迎交流 , 其實這些數據你都可以整理一下寫成一個監控的庫 , 用在自己的中小項目上了 。 然后前端react有bizcharts , g2這些工具 , 前端自己繪制數據大屏 。 我看esay monitor 收集的數據維度還沒有我們這個全呢 。
服務器的性能瓶頸通常為以下幾個:
    CPU 使用率CPU 負載(load)內存磁盤I/O吞吐量 (Throughput)每秒查詢率 QPS(Query Per Second)日志監控/真實QPS響應時間進程監控
獲取 CPU 指標CPU 使用率與CPU 負載 , 這兩個從一定程度上都可以反映一臺機器的繁忙程度 。
CPU 使用率CPU 使用率是運行的程序占用的 CPU 資源 , 表示機器在某個時間點的運行程序的情況 。 使用率越高 , 說明機器在這個時間上運行了很多程序 , 反之較少 。 使用率的高低與 CPU 強弱有直接關系 。 我們先了解一下相關的API和一些名詞解釋 , 幫助我們理解獲取CPU使用率的代碼 。
os.cpus()返回包含有關每個邏輯 CPU 內核的信息的對象數組 。
    model: 一個字符串 , 指定CPU內核的型號 。
    speed: 一個數字 , 指定CPU內核的速度(以MHz為單位) 。
    times: 包含以下屬性的對象:
      user CPU 在用戶模式下花費的毫秒數 。 nice CPU 在良好模式下花費的毫秒數 。 sys CPU 在系統模式下花費的毫秒數 。 idle CPU 在空閑模式下花費的毫秒數 。 irq CPU 在中斷請求模式下花費的毫秒數 。
注意: 的nice值僅用于POSIX 。 在Windows操作系統上 , nice所有處理器的值始終為0 。
大家看到user , nice字段 , 有些同學就優點懵逼了 , 我也是 , 所以仔細查詢了一下其意義 , 請接著 。
useruser 表示 CPU 運行在 用戶態 的時間占比 。
應用進程執行分為 用戶態 以及 內核態 : CPU 在用戶態執行應用進程自身的代碼邏輯 , 通常是一些 邏輯 或 數值計算 ; CPU 在內核態執行進程發起的 系統調用 , 通常是響應進程對資源的請求 。
用戶空間程序是任何不屬于內核的進程 。 Shell、編譯器、數據庫、Web 服務器以及與桌面相關的程序都是用戶空間進程 。 如果處理器沒有空閑 , 那么大部分 CPU 時間應該花在運行用戶空間進程上是很正常的 。
nicenice 表示 CPU 運行在 低優先級用戶態 的時間占比 , 低優先級意味著進程 nice 值小于 0 。
systemuser 表示 CPU 運行在 內核態 的時間占比 。
一般而言 , 內核態 CPU 使用率不應過高 , 除非應用進程發起大量系統調用 。 如果太高 , 表示系統調用時間長 , 例如是IO操作頻繁 。
idleidle 表示 CPU 在空閑狀態的時間占比 , 該狀態下 CPU 沒有任何任務可執行 。
irqirq 表示 CPU 處理 硬件中斷 的時間占比 。
網卡中斷 是一個典型的例子:網卡接到數據包后 , 通過硬件中斷通知 CPU 進行處理 。 如果系統網絡流量非常大 , 則可觀察到 irq 使用率明顯升高 。
結論:用戶態小于70% , 內核態小于35%且整體小于70% , 可以算作健康狀態 。
以下示例說明了Node.js中os.cpus()方法的使用:
范例1:
// Node.js program to demonstrate the // os.cpus() method // Allocating os module const os = require('os'); // Printing os.cpus() values console.log(os.cpus());輸出:
[ { model:'Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz', speed:2712, times: { user:900000, nice:0, sys:940265, idle:11928546, irq:147046 } }, { model:'Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz', speed:2712, times: { user:860875, nice:0, sys:507093, idle:12400500, irq:27062 } }, { model:'Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz', speed:2712, times: { user:1273421, nice:0, sys:618765, idle:11876281, irq:13125 } }, { model:'Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz', speed:2712, times: { user:943921, nice:0, sys:460109, idle:12364453, irq:12437 } } ]下面是如何獲取cpu利用率的代碼
const os = require('os');const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));class OSUtils { constructor() { this.cpuUsageMSDefault = 1000; // CPU 利用率默認時間段 } /** * 獲取某時間段 CPU 利用率 * @param { Number } Options.ms [時間段 , 默認是 1000ms , 即 1 秒鐘] * @param { Boolean } Options.percentage [true(以百分比結果返回)|false] * @returns { Promise } */ async getCPUUsage(options={}) { const that = this; let { cpuUsageMS, percentage } = options; cpuUsageMS = cpuUsageMS || that.cpuUsageMSDefault; const t1 = that._getCPUInfo(); // t1 時間點 CPU 信息 await sleep(cpuUsageMS); const t2 = that._getCPUInfo(); // t2 時間點 CPU 信息 const idle = t2.idle - t1.idle; const total = t2.total - t1.total; let usage = 1 - idle / total; if (percentage) usage = (usage * 100.0).toFixed(2) + "%"; return usage; } /** * 獲取 CPU 瞬時時間信息 * @returns { Object } CPU 信息 * user <number> CPU 在用戶模式下花費的毫秒數 。 * nice <number> CPU 在良好模式下花費的毫秒數 。 * sys <number> CPU 在系統模式下花費的毫秒數 。 * idle <number> CPU 在空閑模式下花費的毫秒數 。 * irq <number> CPU 在中斷請求模式下花費的毫秒數 。 */ _getCPUInfo() { const cpus = os.cpus(); let user = 0, nice = 0, sys = 0, idle = 0, irq = 0, total = 0; for (let cpu in cpus) { const times = cpus[cpu].times; user += times.user; nice += times.nice; sys += times.sys; idle += times.idle; irq += times.irq; } total += user + nice + sys + idle + irq; return { user, sys, idle, total, } }}const cpuUsage = new OSUtils().getCPUUsage({ percentage: true });console.log('cpuUsage: ', cpuUsage.then(data=https://www.52zixue.com/zhanzhang/webqd/js/04/20/70446/>console.log(data))); // 我的電腦是6.15%

推薦閱讀