Heim > Artikel > Web-Frontend > Verstehen Sie schnell die Leistungsindikatoren in Node.js
Dieser Artikel führt Sie durch die Leistungsindikatoren von Node.js, ich hoffe, er wird Ihnen hilfreich sein!
Für uns Front-End-Ingenieure ist die Beherrschung der Node.js
-Anwendungsentwicklung der einzige Weg, Senior/Experten zu werden. Darüber hinaus ist Node.js eine serverseitige Sprache. Wir müssen nicht nur in der Lage sein, Entwicklungsaufgaben abzuschließen, sondern auch auf die Serverleistung achten. [Empfohlenes Lernen: „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
"]
Anwendungsszenarien
NodeJS
vorstellen, werfen wir zunächst einen Blick auf die Anwendungsszenarien. Für verschiedene Anwendungsszenarien sind die zu berücksichtigenden Leistungsindikatoren unterschiedlich. BFF
Die mittlere Schicht, der Proxy der Schnittstelle, fungiert als Gateway-Schicht
webpack
basiert auf Node.js
Electron
kombiniert mit Node.js
SSR serverseitiges Rendering<p> </p>
SSR
verwendet wird, werden CPU
und Netzwerk
zu Der Haupt-Leistungsengpass;<p></p>Wenn Sie NodeJS verwenden, um Arbeiten im Zusammenhang mit der Datenpersistenz durchzuführen, sind <code>I/O
und Disk
stark ausgelastet rate;
CPU
, Speicher
und Netzwerk
die Hauptleistungsengpässe von Node sind. Vor- und NachteilePhasenbeschreibung
Timer: Die Ausführung dieser Phase umfasste die Planung von Rückruffunktionen setTimeout ()
und setInterval()
.
setImmediate()
gesteuert werden (außer für die Planung). ), in anderen Fällen wird der Knoten hier zu gegebener Zeit blockieren. 🎜🎜🎜Erkennung🎜: setImmediate()
Die Callback-Funktion wird hier ausgeführt. 🎜🎜🎜Rückruffunktion zum Schließen🎜: Einige Rückruffunktionen zum Schließen, wie zum Beispiel: socket.on('close', ...)
🎜🎜🎜V8 GC-Mechanismus🎜🎜Wir kennen Node.js® Es ist eine JavaScript-Laufzeitumgebung, die auf der Chrome V8-Engine🎜 basiert und Single-Threaded ist. 🎜🎜Der V8-Speicher
ist in die neue und die alte Generation unterteilt: 🎜🎜🎜neue Generation🎜: Verwendung von Space->-zu-Space-Memory-Recycling-Scavenge-Algorithmus🎜🎜🎜alte Generation🎜: Verwendung Referenzzeichen, Speicherrecycling in Form von Defragmentierung🎜🎜Wenn die GC-Zeit zu lang ist, wird der JS-Thread blockiert und die Dienstleistung beeinträchtigt. Eine unsachgemäße Verwendung des Speichers führt zu einem Speicherüberlauf. Nachdem wir die Grundkenntnisse von Node.js oben verstanden haben, schauen wir uns die Leistungsindikatoren an🎜🎜Leistungsindikatoren🎜🎜Wir beschreiben einen Leistungsindikator auf Systemebene und auf der Node.js-Prozessebene🎜🎜🎜🎜Systemebene🎜🎜🎜🎜Für Auf der Serverebene (Physische Maschine
, Virtuelle Maschine
, Docker
usw.) werden die folgenden Überwachungsindikatoren bereitgestellt: 🎜🎜🎜🎜Speichernutzung ?? 🎜🎜🎜Festplattennutzung 🎜🎜🎜🎜GC
-Statistiken🎜🎜🎜🎜...🎜🎜🎜🎜🎜🎜Prozessebene🎜🎜🎜🎜Für jeden Node.js-Prozess werden die folgenden Überwachungsindikatoren bereitgestellt : 🎜🎜🎜🎜In-Heap- (Gesamt und genutzt) und Off-Heap-Speicherstatistiken🎜🎜🎜🎜Speicherstatistiken, die von jedem Speicherplatz im Heap belegt werden🎜🎜🎜🎜Garbage Collection (GC)-Anteil an der gesamten Prozesslaufzeit🎜 🎜🎜🎜QPS🎜🎜🎜🎜 Drücken Sie 1s, 15s, 30s, 60s CPU-Statistiken🎜🎜🎜🎜libuv-Handle, Timer-Statistiken🎜🎜🎜🎜...🎜🎜🎜🎜🎜So erhalten Sie🎜 🎜🎜Wie sollen wir das erhalten? Welche Leistungsindikatoren wurden oben genannt? 🎜🎜🎜🎜Systemebene🎜🎜🎜Indikatoren auf Systemebene können auf zwei Arten abgerufen werden
1. Betriebssystemmodul
const os = requie('os')
Codebeispiel
Ausführungsergebnisse
2
top [ Parameter] iostat[Parameter]Speichernutzung
//该方法返回 Node.js 进程的内存使用情况的对象 process.memoryUsage()
Codebeispiel
Ausführungsergebnis:
{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472, external: 49879 }复制代码
Erklärung des Substantivs:
RSS ist die Größe des residenten Satzes, d. h. wie viel physischer Speicher diesem Prozess zugewiesen wird (ein Teil des gesamten zugewiesenen Speichers). Wenn dieser Indikator ansteigt, kann es im Allgemeinen zuSpeicherlecks
kommen 内存泄漏
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 und heapUsed repräsentieren die V8-Speichernutzung.
external stellt die Speichernutzung von C++-Objekten dar, die an Javascript gebunden sind und von V8 verwaltet werden.
🎜🎜CPU-Profil🎜🎜🎜🎜Im Allgemeinen können Sie bei einem Speicherverlust einen 🎜Heap-Snapshot🎜 erstellen. Wenn die CPU ungewöhnlich hoch ist, können SieCPU-Profil
🎜🎜 abrufen Kann auf zwei Arten abgerufen werden: 🎜🎜🎜🎜🎜🎜GC-Trace🎜🎜🎜🎜V8 bietet viele Parameteroptionen für den Programmstart von node.js. Sie können GC-Protokollinformationen über den folgenden Beispielcode erhalten🎜🎜🎜🎜node --trace_gc Ausführungsergebnisse 🎜🎜Das können Sie sehen V8 verwendet unterschiedliche GC-Prozesse für alten und neuen Speicher🎜🎜🎜🎜🎜🎜Speicherschnappschuss🎜🎜🎜🎜🎜🎜Wenn Sie den Node-Inspector verwenden, kommt es zu Störungen durch Front-End-Variablen im Snapshot. Es wird empfohlen, heapdump wird zum Speichern von Speicher-Snapshots verwendet. Verwenden Sie devtool, um Speicher-Snapshots anzuzeigen. Wenn Sie Heapdump zum Speichern eines Speicher-Snapshots verwenden, werden nur die Objekte in der Node.js-Umgebung ununterbrochen. Die Verwendung von heapdump
wird später eingeführt🎜heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');🎜🎜Get🎜🎜🎜Methode 1: Befehl
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
更多编程相关知识,请访问:编程入门!!
Das obige ist der detaillierte Inhalt vonVerstehen Sie schnell die Leistungsindikatoren in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!