이 글은 여러분에게 Node.js의 성능 지표를 안내할 것입니다. 여러분에게 도움이 되기를 바랍니다!
프론트엔드 엔지니어에게 Node.js
애플리케이션 개발을 마스터하는 것이 선배/전문가가 되는 유일한 방법입니다. 게다가 Node.js는 서버측 언어이기 때문에 개발 작업을 완료할 수 있을 뿐만 아니라 서버 성능에도 주의를 기울여야 합니다. [추천 학습: "nodejs tutorialNode.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密集型
这里引用官网的一张图,展示了事件循环操作顺序的简化概览
阶段描述
setTimeout()
和 setInterval()
的调度回调函数。setImmediate()
调度的之外),其余情况 node 将在适当的时候在此阻塞。setImmediate()
回调函数在这里执行。socket.on('close', ...)
我们知道Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,同时它又是单线程的。
其中 V8内存
分为新生代和老生代 :
新生代:采用from空间->to空间内存回收scavenge算法
老生代:采用引用标记、碎片整理的形式进行内存回收
如果GC时间过长,会导致js线程阻塞,影响服务性能。内存使用不当,则会造成内存溢出。了解了以上Node.js的基础知识之后,我们再来看性能指标
我们从系统层面和Node.js进程层面进行一个性能指标描述
系统层面
针对服务器(物理机
、虚拟机
、Docker
等)级别,提供如下监控指标:
内存使用
CPU
使用率
系统负载,使用中进程/等待进行的进程数
系统 QPS
硬性性能指标
磁盘使用率
GC
"]
애플리케이션 시나리오
NodeJS
의 성능 지표를 소개하기 전에 먼저 애플리케이션 시나리오를 살펴보겠습니다. 다양한 애플리케이션 시나리오마다 관심을 가져야 할 성능 지표가 다릅니다. BFF
인터페이스의 프록시인 중간 계층은 게이트웨이 계층 역할을 합니다.
webpack
은 Node.js
Electron
과 Node.js
SSR 서버 측 렌더링<p> </p>
SSR
에 사용된다면 CPU
와 Network
는 주요 성능 병목 현상
;NodeJS를 사용하여 데이터 지속성 관련 작업을 수행하는 경우 I/O
및 디스크
의 점유율이 높아집니다 rate;CPU
, 메모리
및 네트워크
는 Node.js의 주요 성능 병목 현상이라고 할 수 있습니다. 장점과 단점여기 공식 웹사이트의 사진이 있으며, 이벤트 루프 작업 순서에 대한 간략한 개요를 보여줍니다
🎜단계 설명🎜🎜🎜🎜🎜 Timer🎜: 이 단계의 실행은setTimeout ()
및 setInterval()
예약 콜백 함수였습니다. 🎜🎜🎜보류 중인 콜백🎜: 다음 루프 반복까지 실행이 지연되는 I/O 콜백입니다. 🎜🎜🎜idle, prepare🎜: 시스템 내부 전용입니다. 🎜🎜🎜Polling🎜: 새 I/O 이벤트를 검색하고 I/O 관련 콜백을 실행합니다(종료 콜백을 제외한 거의 모든 경우 타이머 및 setImmediate()
에 의해 처리됨(예약 제외) ), 다른 경우에는 노드가 적절한 시간에 여기에서 차단됩니다. 🎜🎜🎜Detection🎜: setImmediate()
여기서 콜백 함수가 실행됩니다. 🎜🎜🎜닫기 콜백 함수🎜: socket.on('close', ...)
🎜🎜🎜V8 GC 메커니즘🎜🎜우리는 Node.js®를 알고 있습니다. Chrome V8 엔진🎜을 기반으로 하는 JavaScript 런타임 환경이며 단일 스레드입니다. 🎜🎜V8 메모리
는 신세대와 구세대로 구분됩니다. 🎜🎜🎜신세대🎜: 우주에서 우주로의 메모리 재활용 청소 알고리즘🎜🎜🎜구세대🎜 사용: 참조 표시를 사용하여 조각 모음 형태의 메모리 재활용🎜🎜GC 시간이 너무 길면 js 스레드가 차단되어 서비스 성능에 영향을 미칠 수 있습니다. 메모리를 잘못 사용하면 메모리 오버플로가 발생합니다. 위에서 Node.js의 기본 지식을 이해한 후 성능 지표🎜🎜성능 지표🎜🎜성능 지표를 시스템 수준과 Node.js 프로세스 수준🎜🎜🎜🎜시스템 수준🎜🎜🎜🎜에 대해 설명합니다. 서버( 물리적 머신
, 가상 머신
, Docker
등) 수준에서는 다음과 같은 모니터링 지표가 제공됩니다. 🎜🎜🎜🎜메모리 사용량 🎜🎜🎜🎜 CPU
사용량 🎜🎜🎜🎜시스템 로드, 사용 중인 프로세스 수/진행 대기 중🎜🎜🎜🎜시스템 QPS
🎜🎜🎜🎜하드 성능 지표🎜 🎜🎜🎜디스크 사용량 🎜🎜🎜🎜GC
통계🎜🎜🎜🎜...🎜🎜🎜🎜🎜🎜프로세스 수준🎜🎜🎜🎜Node.js 프로세스별로 다음과 같은 모니터링 지표가 제공됩니다. : 🎜🎜🎜🎜힙 내(전체 및 사용) 및 오프 힙 메모리 통계🎜🎜🎜🎜힙의 각 메모리 공간이 차지하는 메모리 통계🎜🎜🎜🎜전체 프로세스 실행 시간 중 가비지 수집(GC) 비율🎜 🎜🎜🎜QPS🎜🎜🎜🎜 1초, 15초, 30초, 60초를 누르세요. 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></pid>
heapTotal 및 heapUsed는 V8 메모리 사용량을 나타냅니다.
external은 V8에서 관리하는 Javascript에 바인딩된 C++ 개체의 메모리 사용량을 나타냅니다.
🎜🎜CPU 프로필🎜🎜🎜🎜일반적으로 메모리 누수가 있는 경우 🎜Heap 스냅샷🎜을 캡처할 수 있습니다. CPU가 비정상적으로 높으면CPU 프로필
을 캡처할 수 있습니다. 다음 두 가지 방법으로 얻을 수 있습니다: 🎜🎜🎜🎜🎜🎜GC Trace🎜🎜🎜🎜V8은 node.js 프로그램 시작을 위한 다양한 매개변수 옵션을 제공합니다. 다음 예제 코드를 통해 GC 로그 정보를 얻을 수 있습니다🎜🎜🎜🎜node --trace_gc 실행 결과🎜🎜를 보시면 알 수 있습니다 V8은 기존 메모리와 새 메모리에 대해 서로 다른 GC 프로세스를 사용합니다🎜🎜🎜🎜🎜🎜메모리 스냅샷🎜🎜🎜🎜🎜🎜node-inspector를 사용하는 경우 스냅샷에 프런트엔드 가변 간섭이 발생합니다. heapdump는 메모리 스냅샷을 저장하는 데 사용됩니다. devtool을 사용하여 메모리 스냅샷을 확인하세요. heapdump를 사용하여 메모리 스냅샷을 저장하면 Node.js 환경의 개체만 중단되지 않습니다. heapdump
사용법은 추후 소개할 예정입니다🎜heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');🎜🎜Get🎜🎜🎜 소개 방법 1: 명령
kill -USR2 <pid></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 :不错的状态,有新任务也可以及时处理;
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
更多编程相关知识,请访问:编程入门!!
위 내용은 Node.js의 성능 지표를 빠르게 이해하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!