最近客戶與我討論 Windows 與 Linux 作業系統最佳化的議題。雖然我 Windows 的熟悉程度遠遜於 Linux,但 Windows 不見得就不懂,應該至少還贏過很多人,畢竟曾經用 Windows 接了幾個銀行的案子。

由於客戶環境不能放在雲端,所以不是你想擴展就擴展,同時還限制你的伺服器數量 (例如兩台),在這種場景下,很多現代所謂的 DevOps 無用武之地。

但案子又需要能夠應付高併發,例如兩台伺服器要同時承載 12 萬連線,此時該怎麼辦?沒辦法,只能往作業系統鑽研。如果伺服器是用 Visual Studio 的標準 stdio 函式庫,會受限 512 個 File Handling,雖然最多可修改到 2048,但這仍然遠遠不足。所以要改用 CreateFile 函式,這樣單機承載百萬連線基本沒問題。

後來發現 MaxHashTableSize 最多僅能 65535 [註1],即當使用數量超過時,雖然仍然可用,但 Kernel 就無法用 Hash Table 快速找到連線,效能受到影響。

這是 Concurrency (併發),而 CPS (Connection per second) 呢? Nginx 和 Lightttpd 在 Linux 上輕鬆可以達到上萬 CPS,但在 Windows IIS 上,平均每 CPU 核心約可處理 4~5 千 CPS,最佳化後勉強可以近萬。這中間 Windows 和 Linux 就有了差距。

若討論到長連接,Windows 又可能因為先前提到的 MaxHashTableSize 受影響。

總之,Windows 最佳化是條辛苦的路,不過鑽研下去還是有幾個法子可辦。

參考來源

[1] TechNet: MaxHashTableSize