Nodejs 效能提示

Nodejs 效能提示。

nodejs預設使用多少個執行緒

在典型的 Node.js 進程中,使用的執行緒細目如下:

  • 主執行緒:這是執行 Node.js 事件循環並執行 JavaScript 程式碼的單一執行緒。

  • Libuv 執行緒池:預設情況下,libuv 建立一個有 4 個執行緒的執行緒池。這些執行緒用於處理非同步 I/O 操作,例如檔案系統任務和 DNS 查找。

  • V8 引擎線程:Node.js 使用 V8 JavaScript 引擎,該引擎本身利用了額外的線程。通常,V8 使用 2 個執行緒來執行垃圾回收和程式碼最佳化等任務。

如何增加 libuv 執行緒池的執行緒數

若要透過「libuv」增加 Node.js 中的執行緒池大小,請設定「UV_THREADPOOL_SIZE」環境變數:

UV_THREADPOOL_SIZE=64 node app.js
  • UV_THREADPOOL_SIZE 的最大值可以為 1024,一般建議設定為邏輯核心的數量,以優化 I/O 密集型任務的效能。如果沒有正當理由,將其設置得太高可能會導致開銷增加和潛在的效率低下。

  • 在叢集設定中,每個工作進程都有自己的執行緒池,執行緒池的執行緒總數為UV_THREADPOOL_SIZE * numberOfWorkers

  • 對於 CPU 密集型任務,增加UV_THREADPOOL_SIZE可能不會帶來顯著的好處,並可能導致資源競爭。建議利用clusterworker_threads模組。

如何調整或提高記憶體效能

利用 --expose-gc 選項

  • Node.js 中的 --expose-gc 標誌用於公開垃圾回收(GC)功能,允許手動觸發垃圾回收。
node--expose-gc app.js

# 在程式碼中呼叫 global.gc() 來觸發垃圾回收
  • 手動觸發垃圾回收可能暫停應用程式的執行,因為在 GC 期間所有其他操作都會停止。如果過度使用,可能會影響效能。應謹慎使用它,並且僅在特定情況下才使用。

調整 --max-old-space-size

  • Node.js 中的 --max-old-space-size 標誌用於設定 V8 引擎老生代堆的最大記憶體大小,該堆是儲存長壽命物件的地方。

  • --max-old-space-size 的值應基於可用的系統記憶體和應用程式的特定需求。例如,如果伺服器有 8 GB 的 RAM,則將其設為 6 GB,為其他進程留出空間並避免記憶體交換。

node--max-old-space-size = 6144 app.js

# 也可以使用環境變數進行設置,例如:
export NODE_OPTIONS="--max-old-space-size=6144"

nodejs