首頁  >  文章  >  web前端  >  快速搞懂Node.js中的效能指標

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

青灯夜游
青灯夜游轉載
2021-09-16 10:10:183277瀏覽

這篇文章帶大家了解一下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刪除