Node.js Server 效能優化 使用 nginx 以及 pm2 cluster

me
林彥成
2018-08-20 | 2 min.

如何優化 Node.js 伺服器? 這篇文章會淺談怎麼優化 Node.js 的 Server,因為預設會是單線程,效能優化上最簡單就是透過 pm2 cluster 搭配 nginx 來增加可以處理的 requests 數量。

Node.js 設定

Node.js 在建置的時候,要記得把 NODE_ENV 設定為 production,網路上的大大測試看起來有差。

PM2 設定

如果是 node.js 的後端,Linux 的話會需要註冊成系統服務或是使用 FOREVER, PM2 這類的工具,我常用的是 pm2 ,常用的指令可能像下面
pm2 monit
pm2 serve
pm2 的 cluster mode (類似 nginx 配合多核心的設定)(無痛升級效能)

測試的話可以用 jmeter 去打。

Nginx 設定

再來是無痛增加效能解問題的 nginx

  • epoll: 啟用後可以解決 select 機制下 server c10k 的問題
  • 負載平衡: 反向代理該設的參數要設對,proxy_http_version 1.1 請注意
  • 配合 cpu 的核心數設定: 完全 Combo 技概念,大幅增加效能, linux 的虛擬機請下 lscpu 看幾核心?再來是系統比較底層的參數,像是下面的指令:
    1. sysctl -w net.core.somaxconn=512
    2. sysctl -p
  • 壓縮: 可以做在 nginx gzip or node.js compression 這個 middleware 也可以,不過建議是 nginx 設一設就好了
  • 快取: nginx 快取就是設定快取存放位置跟時間,由於是代理的關係,抓回來的東西如果很常被拿,就不需要再去要一次,會快很多。

更多相關的設定歡迎參考我之前寫過的 Nginx Config 教學: SSL (https), load balance, 效能優化

Linux 伺服器系統設定

依照後端的用途,預設的 tcp timeout 時間可能不一定適合,為了效能可以進一步設定:
sudo sysctl -w net.ipv4.tcp_keepalive_time=110
sysctl -p
``

IO 上 Linux 有個 File Descriptor,一個 process 開啟一個檔案時,會建立一個參照去指向檔案,演算法則是針對這個 FD 進行處理。像是 select:
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

  • Apache 的 select (blocking):監考老師問學生,隨堂考試寫完沒,收集足夠後送批改。同時太多學生時,會需要等學生回覆,上限預設 1024。
  • Nginx 的 epoll (non-blocking):老師不再問學生,學生完成後放講桌,收集足夠後送批改。所以當我們在 non-blocking 的情境底下,伺服器端一定會有回覆,但不一定會有資料 (待批改清單),像是 Nginx 就可能因為本身設定的 timeout 就回覆說,您抽的號碼已經超過了,請重新領取號碼牌,是解決 C10K 的一個解決。

API 快取

使用 express-redis-cache,如果是較為靜態的資料,就可以透過將資源短暫快取在記憶體中,可以減少對資料庫的負擔,也可以加快響應的速度。

資源檔

減少資源檔直接向伺服器取用,部分主題提供將腳本或是樣式檔編譯的功能,圖片相關資源檔則可以盡量使用 CDN 來提供,


喜歡這篇文章,請幫忙拍拍手喔 🤣

share