Cet article vous fera découvrir les indicateurs de performance de Node.js, j'espère qu'il vous sera utile !
Pour nous, ingénieurs front-end, maîtriser le développement d'applications Node.js
est le seul moyen pour nous de devenir senior/expert. De plus, Node.js est un langage côté serveur. Nous devons non seulement être capables de réaliser des tâches de développement, mais également faire attention aux performances du serveur. [Apprentissage recommandé : "tutoriel nodejsNode.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
"]
Scénarios d'application
NodeJS
, examinons d'abord ses scénarios d'application. Pour différents scénarios d'application, les indicateurs de performance à prendre en compte sont différents. BFF
La couche intermédiaire, le proxy de l'interface, fait office de couche de passerelle
webpack
est basé sur Node.js
Electron
combinée avec Node.js
SSR rendu côté serveur<p> </p>
SSR
frontal, alors le CPU
et le Réseau
deviendront le principal goulot d'étranglement des performances
;Si vous utilisez NodeJS pour effectuer un travail lié à la persistance des données, alors les E/S
et le Disque
auront une occupation élevée rate;CPU
, la Mémoire
et le Réseau
peuvent être considérés comme les principaux goulots d'étranglement des performances de Node. Avantages et inconvénientsVoici une image citée sur le site officiel, montrant un aperçu simplifié de la séquence de fonctionnement de la boucle d'événement
🎜Description de la phase🎜🎜🎜🎜 🎜Timer🎜 : L'exécution de cette phase a étésetTimeout ()
et setInterval()
planifiant les fonctions de rappel. 🎜🎜🎜Pending callback🎜 : rappel d'E/S dont l'exécution est retardée jusqu'à la prochaine itération de boucle. 🎜🎜🎜idle, prepare🎜 : Pour usage interne du système uniquement. 🎜🎜🎜Polling🎜 : récupère les nouveaux événements d'E/S ; exécute les rappels liés aux E/S (dans presque tous les cas, à l'exception des rappels d'arrêt, ceux gérés par les minuteries et setImmediate()
(sauf pour la planification ), dans d'autres cas, le nœud se bloquera ici au moment opportun. 🎜🎜🎜Détection🎜 : setImmediate()
La fonction de rappel est exécutée ici. 🎜🎜🎜Fonction de rappel de fermeture🎜 : Certaines fonctions de rappel de fermeture, telles que : socket.on('close', ...)
🎜🎜🎜Mécanisme GC V8🎜🎜Nous connaissons Node.js® est un environnement d'exécution JavaScript basé sur le moteur Chrome V8🎜, et il est monothread. 🎜🎜La mémoire V8
est divisée en nouvelle génération et ancienne génération : 🎜🎜🎜nouvelle génération🎜 : utilisation de l'espace->à l'algorithme de récupération de recyclage de mémoire spatiale🎜🎜🎜ancienne génération🎜 : utilisation marques de référence, Recyclage de la mémoire sous forme de défragmentation🎜🎜Si le temps GC est trop long, cela entraînera le blocage du thread js et affectera les performances du service. Une mauvaise utilisation de la mémoire entraînera un débordement de mémoire. Après avoir compris les connaissances de base de Node.js ci-dessus, examinons les indicateurs de performance🎜🎜Indicateurs de performance🎜🎜Nous décrivons un indicateur de performance au niveau du système et au niveau du processus Node.js🎜🎜🎜🎜Niveau du système🎜🎜🎜🎜Pour au niveau du serveur ( Machine physique
, Machine virtuelle
, Docker
, etc.), les indicateurs de suivi suivants sont fournis : 🎜🎜🎜🎜Utilisation de la mémoire 🎜🎜🎜🎜Utilisation du CPU
🎜🎜🎜🎜Charge du système, nombre de processus en cours d'utilisation/en attente de progression🎜🎜🎜🎜Système QPS
🎜🎜🎜🎜Indicateurs de performance durs🎜 🎜🎜🎜Utilisation du disque 🎜🎜🎜🎜Statistiques GC
🎜🎜🎜🎜...🎜🎜🎜🎜🎜🎜Niveau de processus🎜🎜🎜🎜Pour chaque processus Node.js, les indicateurs de surveillance suivants sont fournis : 🎜🎜🎜🎜Statistiques de mémoire dans le tas (totale et utilisée) et hors tas🎜🎜🎜🎜Statistiques de mémoire occupées par chaque espace mémoire dans le tas🎜🎜🎜🎜Proportion de garbage collection (GC) de la durée d'exécution totale du processus🎜 🎜🎜🎜QPS🎜🎜🎜🎜 Appuyez sur 1s, 15s, 30s, 60s Statistiques CPU🎜🎜🎜🎜poignée libuv, statistiques de minuterie🎜🎜🎜🎜...🎜🎜🎜🎜🎜Comment obtenir🎜 🎜🎜Comment devrions-nous obtenir le indicateurs de performance mentionnés ci-dessus ? 🎜🎜🎜🎜Niveau système🎜🎜🎜Les indicateurs au niveau du système peuvent être obtenus des deux manières suivantes
1. module os
const os = requie('os')
exemple de code
résultats d'exécution
2.
top [Paramètres]iostat[Paramètres]Utilisation de la mémoire
//该方法返回 Node.js 进程的内存使用情况的对象 process.memoryUsage()
Exemple de code
Résultat de l'exécution :
{ rss: 4935680, heapTotal: 1826816, heapUsed: 650472, external: 49879 }复制代码
Explication du nom :
rss est la taille de l'ensemble résident, qui correspond à la quantité de mémoire physique allouée à ce processus (une partie de la mémoire totale allouée) Généralement, si cet indicateur augmente,des fuites de mémoire peuvent survenir
内存泄漏
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>
heapTotal et heapUsed représentent l'utilisation de la mémoire V8.
external représente l'utilisation de la mémoire des objets C++ liés à Javascript gérés par V8.
🎜🎜Profil CPU🎜🎜🎜🎜De manière générale, s'il y a une fuite de mémoire, vous pouvez récupérer un 🎜instantané du tas🎜 Si le processeur est anormalement élevé, vous pouvez récupérer leProfil CPU
🎜🎜. Peut être obtenu des deux manières suivantes : 🎜🎜🎜🎜🎜🎜GC trace🎜🎜🎜🎜V8 fournit de nombreuses options de paramètres pour le démarrage du programme node.js. Vous pouvez obtenir des informations de journal GC via l'exemple de code suivant🎜🎜🎜🎜node --trace_gc résultats de l'exécution 🎜🎜Vous pouvez le voir La V8 utilise différents processus GC pour l'ancienne et la nouvelle mémoire🎜🎜🎜🎜🎜🎜Instantané de mémoire🎜🎜🎜🎜🎜🎜Si vous utilisez node-inspector, il y aura des interférences de variables frontales dans l'instantané. Il est recommandé d'utiliser heapdump< /a> est utilisé pour enregistrer des instantanés de mémoire, utilisez devtool pour afficher l'instantané de la mémoire. Lorsque vous utilisez heapdump pour enregistrer un instantané de mémoire, seuls les objets de l'environnement Node.js seront ininterrompus. L'utilisation de heapdump
sera introduite plus tard🎜heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');
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 :不错的状态,有新任务也可以及时处理;
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
更多编程相关知识,请访问:编程入门!!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!