Node.js의 성능 지표를 빠르게 이해하세요.
이 글은 여러분에게 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密集型
事件循环(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의 기본 사항과 성능 지표에 대한 사전 소개를 제공합니다. 애플리케이션 시나리오
NodeJS
의 성능 지표를 소개하기 전에 먼저 애플리케이션 시나리오를 살펴보겠습니다. 다양한 애플리케이션 시나리오마다 관심을 가져야 할 성능 지표가 다릅니다. - Desktop 애플리케이션
Electron
과 Node.js SSR 서버 측 렌더링<p> </p>
- Node.js가 프런트엔드
SSR
에 사용된다면CPU
와Network
는 주요성능 병목 현상
;NodeJS를 사용하여 데이터 지속성 관련 작업을 수행하는 경우I/O
및디스크
의 점유율이 높아집니다 rate; - 그리고 대부분의 경우
CPU
,메모리
및네트워크
는 Node.js의 주요 성능 병목 현상이라고 할 수 있습니다. 장점과 단점 - node.js는 내결함성이 있고 성능이 그다지 좋지 않습니다.
- node.js는 데이터베이스 운영에 전문적이지 않습니다.
- node.js는 비동기 IO 처리에 강합니다.
node v8本身内存大小的限制:64 位系统约为 1.4GB,32 位系统约为 0.7GB。
程序使用不当:全局变量引用、闭包使用不当、事件监听未销毁
大文件应用:应该使用buffer操作,buffer不占用v8内存
- 🎜노드 v8 자체의 메모리 크기 제한: 64비트 시스템은 약 1.4GB, 32비트 시스템은 약 0.7GB입니다. 🎜
- 🎜부적절한 프로그램 사용: 전역 변수 참조, 부적절한 클로저 사용, 이벤트 리스너가 파괴되지 않음🎜
- 🎜대용량 파일 응용 프로그램: 버퍼 작업을 사용해야 함, 버퍼가 점유되지 않음 v8 memory🎜
-
memory_sys
:系统内存使用百分比。 -
memory_node
: 所有 Node.js 进程内存使用之和占系统内存的百分比。 -
cpu_sys
:系统 CPU 使用百分比。 -
cpu_node
:所有 Node.js 进程 CPU 使用百分比之和。 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
较高,需要引起关注。
-
gc_avg
:所有 Node.js 进程垃圾回收时间占比平均值。 -
gc_max
:每分钟内垃圾回收时间最多的 Node.js 进程的垃圾回收时间占比。
BFF
인터페이스의 프록시인 중간 계층은 게이트웨이 계층 역할을 합니다.
webpack
은 Node.js
io 집약적이며 CPU 집약적
이벤트 루프(libuv)여기 공식 웹사이트의 사진이 있으며, 이벤트 루프 작업 순서에 대한 간략한 개요를 보여줍니다
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 [ 매개변수]메모리 사용량
//该方法返回 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内存泄漏通常有以下三种情况:
那如何去排查内存泄漏呢?可以通过以下工具使用
工具使用
一. heapdump:生成内存快照 + chrome面板分析
需要注意的是,打印内存快照是很耗 CPU 的操作,可能会对线上业务造成影响。
引入
const heapdump = require('heapdump')
获取
方式一:命令 kill -USR2 <pid>
heapTotal 및 heapUsed는 V8 메모리 사용량을 나타냅니다.
external은 V8에서 관리하는 Javascript에 바인딩된 C++ 개체의 메모리 사용량을 나타냅니다.
CPU 프로필
을 캡처할 수 있습니다. 다음 두 가지 방법으로 얻을 수 있습니다: 🎜🎜



heapdump
사용법은 추후 소개할 예정입니다🎜🎜스트레스 테스트🎜
🎜프로젝트가 온라인화되기 전, 스트레스 테스트를 통해 메모리 누수가 있는지 알아보는 스트레스 테스트가 필요합니다🎜 🎜🎜스트레스 테스트 도구🎜: ab 테스트(ApacheBench), autocannon🎜🎜다음은 ab 함수를 이용한 스트레스 테스트 결과입니다🎜🎜
🎜메모리 누수🎜
🎜Node.js는 Java, PHP 등 비교적 전문적인 백엔드 언어이지만 일부 기본 구성은 상대적으로 불완전한. 단일 스레드의 특성과 결합하여 대규모 애플리케이션에서는 서버나 Node.js 프로세스에서 성능 병목 현상이 발생하기 쉽습니다. 🎜🎜노드 메모리 누수를 일으키는 상황은 일반적으로 세 가지입니다: 🎜🎜도구 사용법🎜
🎜🎜🎜1. 힙 덤프: 메모리 스냅샷 생성 + 크롬 패널 분석🎜🎜🎜🎜메모리 스냅샷 인쇄는 CPU를 많이 소모한다는 점에 유의해야 합니다. 온라인 비즈니스에 영향을 미칠 수 있습니다. 🎜🎜🎜 🎜🎜heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');
kill -USR2 <pid>
🎜🎜🎜🎜方式二:调用writeSnapshot
heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');
chrome面板分析
二. alinode
阿里云也提供了Nodejs应用的性能平台alinode,可以很方便、全面的为我们收集性能指标数据,同时以可视化图表的方式,更加的直观。接入alinode可参考5分钟快速入门
以下是部分采集数据图表展示
一些指标描述
Memory
CPU
Load
QPS
该实例所有 Node.js 进程每秒钟处理的 HTTP 请求数之和。
GC
三. 开源Easy-Monitor
企业级 Node.js 应用性能监控与线上故障定位解决方案。
Easy-Monitor是一款轻量级的Node性能监控工具。快速入口
我们也可以给予它的基础之上去搭建部署一套自己内部的性能平台。
总结
以上是我关于Node.js性能指标以及获取的简单介绍,更多的是对包含性能点的一个整体上的介绍,那针对每个性能指标我们都可以去再做更深入的研究。希望这篇文章能够帮助你,同时也感谢你的阅读,期待再见~
参考
Node.js 性能平台
如何分析 Node.js 中的内存泄漏
本文示例代码
原文地址:https://juejin.cn/post/7008006326857138184
作者:比心FE
更多编程相关知识,请访问:编程入门!!
위 내용은 Node.js의 성능 지표를 빠르게 이해하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

Node용 Docker 이미지를 선택하는 것은 사소한 문제처럼 보일 수 있지만 이미지의 크기와 잠재적인 취약점은 CI/CD 프로세스와 보안에 상당한 영향을 미칠 수 있습니다. 그렇다면 최고의 Node.js Docker 이미지를 어떻게 선택합니까?

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

Node 19가 정식 출시되었습니다. 이 글에서는 Node.js 19의 6가지 주요 기능에 대해 자세히 설명하겠습니다. 도움이 되셨으면 좋겠습니다!

Node.js는 GC(가비지 수집)를 어떻게 수행하나요? 다음 기사에서는 이에 대해 설명합니다.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

초기에 JS는 브라우저 측에서만 실행되었습니다. 유니코드로 인코딩된 문자열은 처리하기 쉬웠지만 바이너리 및 유니코드가 아닌 인코딩된 문자열을 처리하는 것은 어려웠습니다. 그리고 바이너리는 컴퓨터의 가장 낮은 데이터 형식인 비디오/오디오/프로그램/네트워크 패키지입니다.
