隨著網際網路的快速增長,多媒體網路伺服器面臨的並發存取量劇增。單一伺服器的處理能力與 I/O 效能逐漸成為服務瓶頸,必須採用多伺服器叢集與負載平衡技術來分擔流量。本文探討負載平衡技術演進,並基於 FreeBSD 的網路位址轉換(NAT)機制,實作一個軟體型負載平衡閘道,動態依據後端伺服器的 CPU 與 I/O 狀態分配請求,解決高併發下的效能問題。
最早期的做法是在 DNS 中為同一主機名對應多個 IP 位址,客戶端查詢時會取得不同位址,從而達到分流目的。優點是簡單易行,但無法感知伺服器異質性與即時負載狀態,容易造成負載不均。
反向 Proxy 可將請求轉發給內部 Web 伺服器群,並套用最佳化策略(如最少連線、回應時間)。然而隨著並發連線增長,Proxy 本身成為新瓶頸,且難以支援複雜應用協定。
廠商將 NAT 負載平衡整合至交換器,支援隨機、連線數、回應時間等演算法。但硬體實作靈活度低,難以支援優化策略與非標準協定。
為彌補硬體不靈活,本文採用 FreeBSD 的 divert socket 與 ipfw 防火牆,開發自訂 NAT 守護行程 natd,實作支援動態負載演算法的軟體閘道。此架構易於擴充協定支援,並能整合更精細的負載度量模型。
傳統策略忽略請求類型差異與伺服器異質性。本文將請求分為兩類:
定義伺服器負載公式:
L = Ns + a × Nd + b × max(0, L_actual - Ll)
Ns:靜態服務行程數Nd:動態服務行程數a:動態請求權重(10~100)Ll:硬體正常負載上限b:超載懲罰權重,與 Ll 成反比,避免弱效能主機在全叢集超載時仍分得最多任務中心控制器定期從各後端伺服器的守護行程收集負載指標,將新連線導向負載最低的伺服器,達到真正的動態均衡。
ipfw 將封包導向 divert socket,由用戶空間 natd 依負載表重寫目的 IP 並重新注入核心路由。測試環境:三台 FreeBSD 伺服器以快速乙太網路互連。針對 HTTP 協定設計三類測試:
| 測試類型 | 說明 |
|---|---|
| 動態 CGI | 測試 CPU 密集型負載平衡 |
| 小型靜態檔 | 測試高頻連線下的平衡狀態 |
| 大型靜態檔 | 測試磁碟與網路 I/O 密集型平衡 |
natd 進程佔用 76% CPU,成為瓶頸。natd 以鏈結串列維護連線狀態,演算法效率限制了網路效能。所有封包必須經過閘道的 natd 處理,高併發、大流量時,用戶空間封包複製與鏈結串列查找成為系統瓶頸。後續優化方向:
基於 NAT 的軟體負載平衡閘道有效解決後端 CPU 與磁碟 I/O 壓力,但閘道本身的網路 I/O 處理能力成為系統上限。透過演算法優化與硬體升級可進一步提升頻寬上限。未來工作將著重於多維度資源監控與核心級封包處理,構建更高效、彈性的負載平衡基礎設施。