跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

快速搞懂Node.js中的性能指标

本篇文章带大家了解一下 node.js 的性能指标,希望对大家有所帮助! 对于我们前端工程师来说,掌握
Node.js
应用开发是我们走上资深/专家的一条必经之路。此外Node.js是一门服务端语言,我们不仅要能够完成开发任务,而且更应该要关注服务器性能。【推荐学习:《 nodejs 教程 》】 本文就针对Node.js的基础和性能指标做一些初步的介绍。 应用场景 在介绍
NodeJS
性能指标之前呢,我们先来看看它的应用场景,针对不同的应用场景,所要关注的性能指标是有所不同的。
BFF
中间层,接口的代理,充当网关层 开发构建工具
gulp
,
webpack
基于Node.js 桌面应用程序
Electron
和Node.js结合
SSR
服务端渲染 Node.js如果是用于前端
SSR
的话,那么
CPU
和
网络
就会成为主要的
性能瓶颈
; 如果使用NodeJS来进行数据持久化相关的工作,那么
I/O
和
磁盘
会有很高的占用率; 而在大多数场景下,
CPU
、
内存
以及
网络
可以说是Node的主要性能瓶颈。 优缺点 node.js 容错,性能不是很好 node.js操作数据库不专业 node.js处理异步io强 io密集型,不适合cpu密集型 事件循环(libuv) 这里引用官网的一张图,展示了事件循环操作顺序的简化概览 阶段描述 定时器 :本阶段执行已经被
setTimeout()
和
setInterval()
的调度回调函数。 待定回调 :执行延迟到下一个循环迭代的 I/O 回调。 idle, prepare :仅系统内部使用。 轮询 :检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和
setImmediate()
调度的之外),其余情况 node 将在适当的时候在此阻塞。 检测 :
setImmediate()
回调函数在这里执行。 关闭的回调函数 :一些关闭的回调函数,如:
socket.on('close', ...)
V8 GC机制 我们知道Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,同时它又是单线程的。 其中
V8内存
分为新生代和老生代 : 新生代 :采用from空间->to空间内存回收scavenge算法 老生代 :采用引用标记、碎片整理的形式进行内存回收 如果GC时间过长,会导致js线程阻塞,影响服务性能。内存使用不当,则会造成内存溢出。了解了以上Node.js的基础知识之后,我们再来看性能指标 性能指标 我们从系统层面和Node.js进程层面进行一个性能指标描述 系统层面 针对服务器(
物理机
、
虚拟机
、
Docker
等)级别,提供如下监控指标: 内存使用
CPU
使用率 系统负载,使用中进程/等待进行的进程数 系统
QPS
硬性性能指标 磁盘使用率
GC
统计 …… 进程层面 针对每个 Node.js 进程,提供如下监控指标: 堆内(total 和 used)和堆外内存统计 堆内各个内存空间占用内存统计 垃圾回收(GC)占整个进程运行时间比例 QPS 按 1s、15s、30s、60s 的 CPU 统计 libuv 句柄,定时器统计 …… 如何获取 针对上面讲到的性能指标,我们该如何获取呢? 系统层面 系统层面的指标可以通过以下两种方式获取 1、os模块
const os = requie('os')
代码示例 执行结果 2、top和iostat命令查看内存和硬盘使用 top [参数] iostat[参数] 内存使用情况
//该方法返回 Node.js 进程的内存使用情况的对象 process.memoryUsage()
代码示例 执行结果:
{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472, external: 49879 }复制代码
名词解释: rss 是驻留集大小, 是给这个进程分配了多少物理内存(占总分配内存的一部分) Node.js中文手册 Node.js 中文手册下载 下载 一般这个指标上升,可能会发生
内存泄漏
heapTotal 和 heapUsed 代表 V8 的内存使用情况。 external 代表 V8 管理的,绑定到 Javascript 的 C++ 对象的内存使用情况。 CPU profile 一般来说,如果涉及到内存泄漏的,可以抓取 堆快照 ,那如果是 CPU 异常飙高的,可以抓取
CPU Profile
可通过以下两种方式进行获取: GC trace V8提供了很多node.js程序启动的参数选项,通过以下实例代码的方式可以获取到GC日志的信息 node --trace_gc的执行结果 可以看到V8对于新老内存采用不同的GC过程 内存快照 如果使用 node-inspector 的话,快照中会有前端的变量干扰。推荐使用 heapdump 用来保存内存快照,使用 devtool 来查看内存快照。使用 heapdump 保存内存快照时,只会有 Node.js 环境中的对象,不会受到干扰。后面会介绍
heapdump
的使用 压力测试 项目上线前是要进行压力测试的,通过压力测试来寻找是否存在内存泄漏 压测工具 :ab测试(ApacheBench)、autocannon 下面展示了使用ab功能进行压力测试的结果 上述运行结果可以看到 我们的一个QPS:4301.28/sec 每个请求的平均时长:23ms 传输率:617.47kb/s 内存泄漏 Node.js相对比较专业的后端语言Java、PHP等,一些基础的建设相对是不够完善的。加上单线程的特点,在大型的应用当中,很容易引起服务器或者Node.js进程的性能瓶颈。 引起node内存泄漏通常有以下三种情况: node v8本身内存大小的限制:64 位系统约为 1.4GB,32 位系统约为 0.7GB。 程序使用不当:全局变量引用、闭包使用不当、事件监听未销毁 大文件应用:应该使用buffer操作,buffer不占用v8内存 那如何去排查内存泄漏呢?可以通过以下工具使用 工具使用 一. heapdump:生成内存快照 + chrome面板分析 需要注意的是,打印内存快照是很耗 CPU 的操作,可能会对线上业务造成影响。 引入
const heapdump = require('heapdump')
获取 方式一:命令
kill -USR2
方式二:调用writeSnapshot
heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');
chrome面板分析 二. alinode 阿里云也提供了Nodejs应用的性能平台alinode,可以很方便、全面的为我们收集性能指标数据,同时以可视化图表的方式,更加的直观。接入alinode可参考 5分钟快速入门 以下是部分采集数据图表展示 一些指标描述 Memory
memory_sys
:系统内存使用百分比。
memory_node
: 所有 Node.js 进程内存使用之和占系统内存的百分比。 CPU
cpu_sys
:系统 CPU 使用百分比。
cpu_node
:所有 Node.js 进程 CPU 使用百分比之和。 Load
load1
:1分钟内平均 Load。
load5
:5分钟内平均 Load。
load15
:15分钟内平均 Load。 下面是一些
Load
的参考信息 (
Load
已经归一化处理,如果是 N 核 CPU,那么相应
Load * N
):
0.7 < Load < 1
:不错的状态,有新任务也可以及时处理;
Load = 1
:即将有任务需要额外的等待时间才能被处理,需要引起关注;
Load > 5
:任务需要等待时间很长,需要干预处理。 通常先看
load15
,如果很高,再看
load1
和
load5
,看是否有下降趋势,短时间内
load1
大于 1,不用担心,如果长时间
Load
较高,需要引起关注。 QPS 该实例所有 Node.js 进程每秒钟处理的 HTTP 请求数之和。 GC
gc_avg
:所有 Node.js 进程垃圾回收时间占比平均值。
gc_max
:每分钟内垃圾回收时间最多的 Node.js 进程的垃圾回收时间占比。 三. 开源Easy-Monitor 企业级 Node.js 应用性能监控与线上故障定位解决方案。 Easy-Monitor是一款轻量级的Node性能监控工具。 快速入口 我们也可以给予它的基础之上去搭建部署一套自己内部的性能平台。 总结 以上是我关于Node.js性能指标以及获取的简单介绍,更多的是对包含性能点的一个整体上的介绍,那针对每个性能指标我们都可以去再做更深入的研究。希望这篇文章能够帮助你,同时也感谢你的阅读,期待再见~ 参考 Node.js 性能平台 如何分析 Node.js 中的内存泄漏 本文示例代码 原文地址:https://juejin.cn/post/7008006326857138184作者:比心FE 更多编程相关知识,请访问: nodejs 教程 0!!

相关文章