이 글은 여러분에게 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🎜
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></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');🎜🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

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

Dreamweaver Mac版
시각적 웹 개발 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
