調整內核參數
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1
這兩個參數可以讓 tcp 連接回收、再利用。
摘錄
『HTTP 權威指南』page 90 關於 TIME_WAIT 的解釋:
TIME_WAIT 端口耗盡是很嚴重的性能問題,會影響到性能基准,但在現實中相對較少出現。大多數遇到性能基准問題的人最終都會碰到這個問題,而且性能都會變得出乎意料的差,所以這個問題值得特別關注。
當某個 TCP 端點關閉 TCP 連接時,會在內存中維護一個小的控制塊,用來記錄最近所關閉連接的 IP 地址和端口號。這類信息只會維持一小段時間,通常是所估計的最大分段試用期的兩倍(稱為2MSL,通常為2分鍾)左右,以確保在這段時間內不會創建具有相同地址和端口號的新連接。實際上,這個算法可以防止在2分鍾內創建、關閉並重新創建2個相同 IP 地址和端口號的連接。
現在高速路由器的使用,是的重復分組幾乎不可能在連接關閉的幾分鍾之后,出現在服務器上。有些操作系統會將2MSL 設置為一個較小的值,但修改此值時要特別小心。分組確實會被復制,如果來自之前連接的復制組插入具有相同連接值的新 TCP 流,會破壞 TCP 數據。
2MSL 的連接關閉延遲通常不是什么問題,但在性能基准環境下就可能會成為一個問題。進行性能基准測試時,通常只有一台或幾台用來產生流量的計算機連接到某系統中去,這樣就限制了連接到服務器的客戶端 IP 地址數。而且,服務器通常會在 HTTP 默認端口80上進行監聽。用 TIME_WAIT 防止端口號重用時,這些情況也限制了可用的連接值組合。
在只有一個客戶端和一台 web 服務器的異常情況下,構建一條 TCP 連接的4個值:
<源 IP 地址,源端口,目標 IP 地址,目標端口>
其中的3個都是固定的——只有源端口號可以隨意改變:
<client-IP, source-port, server-IP,80>
客戶端每次連接到服務器上去時,都會獲得一個新的源端口,以實現連接的唯一性。但由於可用源端口的數量有限(比如60000個),而且在2MSL(比如,120s)內連接是無法重用的,連接率就被限制在了:60000/120 = 500次/s. 如果再不斷進行優化,並且服務器的連接率不超過500次/s, 就可以確保不會遇到 TIME_WAIT 端口耗盡的問題。要修正這個問題,可以增加客戶端負載生成器的數量,或者確保客戶端和服務器在循環使用幾個虛擬 IP 地址以增加更多的連接組合。
即使沒有遇到端口耗盡的問題,也要特別小心有大量連接出於打開狀態的情況,或為處於等待狀態的連接分配了大量控制塊的情況。在有大量打開連接或控制塊的情況下,有些操作系統的速度回嚴重減緩。