HTTP 伺服器在高負載時反應會變慢, 但檢視系統的使用資源, 例如 CPU, 記憶體及 Load Average 則很正常, 當重新啟動 HTTP 伺服器後, 問題又暫時得以解決。用以下 netstat 檢查連線的統計資料:
# netstat -nat | awk ‘{print $6}’ | sort | uniq -c | sort -n
會發現 ESTABLISHED 連線其實並不高, 但就積壓了大量 TIME_WAIT 連線.
要解決這個題題, 可以修改 Linux 的變數, 先用 root 開啟 /etc/sysctl.conf:
# vi /etc/sysctl.conf
加入以下 3 行:
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
在 vi 儲存檔案及離開:
:wq
上面 3 行設定的解釋分別是:
net.ipv4.tcp_fin_timeout:
保留 FIN_WAIT2 的時間, 預設值是 60, 單位是秒.
net.ipv4.tcp_tw_recycle:
TCP 連線中 TIME_WAIT sockets 的快速回收, 預設是關閉.
net.ipv4.tcp_tw_reuse = 1
允許將 TIME_WAIT sockets 在新的 TCP 連線重新使用, 預設是關閉.
修改 /etc/sysctl.conf 後, 下次開機時會自動使用新設定, 在不重新啟動下立即讀取 /etc/sysctl.conf 的變更, 執行以下指令:
# sysctl -p
新的設定可能不會立即反應在 netstat 指令裡面, 需要等待已經存在的連線釋放, 一般過了幾分鐘後, 可以再之執行 netstat 指令檢視系統連線狀態:
# netstat -nat | awk ‘{print $6}’ | sort | uniq -c | sort -n