本篇文章带大家了解一下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 是驻留集大小, 是给这个进程分配了多少物理内存(占总分配内存的一部分)
一般这个指标上升,可能会发生内存泄漏
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 <pid>
方式二:调用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 898be7a1d0179eaf7fa98db33a31c1cd 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
更多编程相关知识,请访问:编程入门!!
以上就是快速搞懂node.js中的性能指标的详细内容。