怎么获取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%

推荐阅读