四層負載基於 IP+Port,七層負載基於 URL 等應用層資訊。本文分析 Windows 平台實作第 7 層軟負載的效能與可靠性。
效能分析
- 外網連線管理與協定解析:用
http.sys (HttpApi.dll, HttpListener) 核心級機制,效能有保障。
- 內網 RealServer 連線管理與封包:用
HttpWebRequest 內建機制,但問題多:
- 連線管理:預設每請求新建連線、收回應拆除,受連接埠限制 (65535) 導致出站連線不足。嘗試啟用 KeepAlive 解決。
- 封包重組:HttpListener 解析後仍需重組為 HttpWebRequest 格式(複製 URI、Header、Cookie、Body),記憶體複製損耗效能,難以規避。
- 常規 Web 應用:Request 小、Response 大,回應仍須經 Proxy 轉發再複製,嚴重影響效能。無法像 LVS 做 Direct Route(需修改 MAC/IP 隧道/TCP 狀態遷移),成本太高。
- HTTP 協定限制:請求回應必須成對,預設同步等待回應才能送下一個請求。HTTP 1.1 pipeline 有限制(POST 不可用、首次請求不可用、批次大小難定、斷線多請求失敗),必然影響效能。
- HttpListener 非同步模式:APM 模式 (
BeginXXX/EndXXX) 頻繁調用產生大量 IAsyncRequest 物件增加 GC 壓力,無自訂物件池介面。若支援事件型非同步 (XXXAsync) 可解決。
- 使用者/核心模式切換:HttpListener 為 .NET 封裝類在使用者模式,HTTP.SYS 在核心模式,收發請求需兩次模式切換降低效能。Linux LVS 可在核心態做 7 層轉發,Windows 需 TDI/NDIS 開發太複雜暫不考慮。
可靠性分析與容災方案
- 前端 4 層負載 + 多台 7 層軟負載共享雜湊策略:4 層按 Session 隨機分流,所有 7 層節點均可正確處理任一請求。單節點掛掉其餘續工,4 層 Keepalive 偵測移除故障節點。優先採用。
- 7 層軟負載雙機熱備 + ARP 欺騙漂移 IP:主機掛掉備機接管。屬山寨方案,切換可能造成短暫請求失敗,不優先考慮。