在 macOS 做伺服器壓力測試要注意的 1 項設定 — net.inet.tcp.msl
最近在 macOS 上面做 HTTP server 的壓力測試時,發現一件怪事:
「不論怎麼調整 Sever 的程式碼,壓力測試時都只能處理 16,000 個左右的 requests 」
一查才知道 macOS 大約只有 16,000 個 ports 可以供連線使用,每次連線結束就需要等約 15 秒的時間,被佔用的 port 才會重新恢復可以使用的狀態,這個情況導致 15 秒內平均每秒可以處理的連線數約在 1,000 左右。
如果要緩解這個問題,可以使用以下指令縮短等待時間,例如縮短到 100ms:
$ sudo sysctl -w net.inet.tcp.msl=100
msl
是 Maximum segment lifetime 的縮寫。
恢復的指令:
$ sudo sysctl -w net.inet.tcp.msl=15000
另 1 種方法則是建議在 Linux 上面做壓力測試。
p.s. 其實 Linux 也可能會有類似的問題,它的 MSL 預設是 60 秒,只是它沒有 16,000 這個限制,所以遇到這個問題的可能性相對低很多。
Linux 查 msl 的指令:
$ sysctl -a | grep tcp_fin_timeout
參考資料
https://rocketeer.be/blog/2014/04/benchmarking-on-osx-http-timeouts/