搜尋
首頁web前端js教程快速搞懂Node.js中的效能指標
快速搞懂Node.js中的效能指標Sep 16, 2021 am 10:10 AM
node.js性能指標

這篇文章帶大家了解一下Node.js的效能指標,希望對大家有幫助!

快速搞懂Node.js中的效能指標

對我們前端工程師來說,掌握Node.js應用程式開發是我們走上資深/專家的一條必經之路。另外Node.js是一門服務端語言,我們不僅要能夠完成開發任務,更應該要專注在伺服器效能上。 【推薦學習:《nodejs 教學》】

本文就針對Node.js的基礎與效能指標做一些初步的介紹。

應用場景

在介紹NodeJS效能指標之前呢,我們先來看看它的應用場景,針對不同的應用場景,所要關注的效能指標是有所不同的。

  • BFF中間層,介面的代理,充當網關層

  • 開發建置工具gulpwebpack基於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)

這裡引用官網的一張圖,展示了事件循環操作順序的簡化概覽

快速搞懂Node.js中的效能指標

##階段描述

    計時器
  • :此階段執行已經被 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 進程,提供以下監控指標:

堆內(total 和used)和堆外記憶體統計
  • #堆內各個記憶體空間佔用記憶體統計
  • 垃圾回收(GC)佔整個行程運行時間比例
  • QPS
  • 以1s、15s、30s、60s 的CPU 統計
  • libuv 句柄,定時器統計
  • #…
  • 如何取得

針對上面講到的效能指標,我們該如何取得呢?

系統層面

#

系統層面的指標可以透過以下兩種方式取得

1、os模組

const os = requie('os')

程式碼範例

快速搞懂Node.js中的效能指標

執行結果

快速搞懂Node.js中的效能指標

2、top和iostat指令查看記憶體和硬碟使用

top [參數]

快速搞懂Node.js中的效能指標

iostat[參數]

快速搞懂Node.js中的效能指標

記憶體使用量##

//该方法返回 Node.js 进程的内存使用情况的对象
process.memoryUsage()

程式碼範例

快速搞懂Node.js中的效能指標

執行結果:

{
  rss: 4935680,
  heapTotal: 1826816,
  heapUsed: 650472,
  external: 49879
}复制代码

名詞解釋:

rss 是駐留集大小, 是給這個程序分配了多少物理記憶體(佔總分配記憶體的一部分)

一般這個指標上升,可能會發生

記憶體洩漏

heapTotal 和heapUsed 代表V8 的記憶體使用量。

external 代表 V8 管理的,綁定到 Javascript 的 C 物件的記憶體使用情況。

CPU profile

一般來說,如果涉及到記憶體洩漏的,可以抓取

堆快照,那如果是CPU 異常飆高的,可以抓取CPU Profile

可透過以下兩種方式進行取得:

快速搞懂Node.js中的效能指標

GC trace

V8提供了許多node.js程式啟動的參數選項,透過以下實例程式碼的方式可以取得到GC日誌的資訊

快速搞懂Node.js中的效能指標

node --trace_gc的執行結果

可以看到V8對於新舊記憶體採用不同的GC過程

快速搞懂Node.js中的效能指標

記憶體快照

快速搞懂Node.js中的效能指標

如果使用node-inspector 的話,快照中會有前端的變數幹擾。建議使用 

heapdump 用來保存記憶體快照,使用 devtool 檢視記憶體快照。使用 heapdump 儲存記憶體快照時,只會有 Node.js 環境中的對象,不會受到干擾。後面會介紹heapdump的使用

壓力測試

#專案上線前是要進行壓力測試的,透過壓力測試來尋找是否存在內存洩漏

壓測工具:ab測試(ApacheBench)、autocannon

下面展示了使用ab功能進行壓力測試的結果

1快速搞懂Node.js中的效能指標

上述運行結果可以看到

我們的一個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面板分析

1快速搞懂Node.js中的效能指標

##要注意的是,列印記憶體快照是很耗CPU 的操作,可能會對線上業務造成影響。 #########引入######
const heapdump = require('heapdump')
###### 取得##########方式一:指令###kill -USR2 #### ############

方式二:调用writeSnapshot

heapdump.writeSnapshot('./' + Date.now() + '.heapsnapshot');

chrome面板分析

1快速搞懂Node.js中的效能指標

二. alinode

阿里云也提供了Nodejs应用的性能平台alinode,可以很方便、全面的为我们收集性能指标数据,同时以可视化图表的方式,更加的直观。接入alinode可参考5分钟快速入门

以下是部分采集数据图表展示

1快速搞懂Node.js中的效能指標

一些指标描述

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中文網其他相關文章!

陳述
本文轉載於:掘金--比心FE。如有侵權,請聯絡admin@php.cn刪除
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

一文解析package.json和package-lock.json一文解析package.json和package-lock.jsonSep 01, 2022 pm 08:02 PM

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

分享一个Nodejs web框架:Fastify分享一个Nodejs web框架:FastifyAug 04, 2022 pm 09:23 PM

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

怎么使用pkg将Node.js项目打包为可执行文件?怎么使用pkg将Node.js项目打包为可执行文件?Jul 26, 2022 pm 07:33 PM

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

图文详解node.js如何构建web服务器图文详解node.js如何构建web服务器Aug 08, 2022 am 10:27 AM

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。