解決 Linux 大量 TIME_WAIT TCP 連線

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

在 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




Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.