高併發服務器(Squid、Nginx、Apache)常面臨大量 TIME_WAIT 連接佔用端口資源、導致新建連接失敗。本文深度解析 TIME_WAIT 存在必要性,提供 sysctl 內核參數調優方案、Squid 專項優化配置及效果驗證方法。
# 統計各狀態連接數
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
# 輸出示例:
# TIME_WAIT 18122
# ESTABLISHED 70
# FIN_WAIT1 229
| 參數 | 推薦值 | 作用 |
|---|---|---|
net.ipv4.tcp_syncookies | 1 | 啟用 SYN Cookie 防 SYN Flood |
net.ipv4.tcp_tw_reuse | 1 | 允許 TIME_WAIT 套接字用於新連接(客戶端有效) |
net.ipv4.tcp_tw_recycle | 1 | 快速回收 TIME_WAIT(NAT 環境慎用,內核 4.12+ 已移除) |
net.ipv4.tcp_fin_timeout | 30 | FIN-WAIT-2 超時時間(秒) |
net.ipv4.tcp_keepalive_time | 1200 | Keepalive 探測間隔(秒),默認 7200 |
net.ipv4.ip_local_port_range | 1024 65000 | 擴大可用端口範圍 |
net.ipv4.tcp_max_syn_backlog | 8192 | SYN 隊列長度 |
net.ipv4.tcp_max_tw_buckets | 5000 | 系統最大 TIME_WAIT 數量,超過直接清除並報警 |
# /etc/sysctl.conf 追加 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000
關鍵差異:tcp_max_tw_buckets 為硬性上限,防止 Squid 被海量 TIME_WAIT 拖死,對 Apache/Nginx 效果一般但對 Squid 至關重要。
# 生效
/sbin/sysctl -p
# 驗證
watch -n 1 'netstat -n | awk "/^tcp/ {++S[\$NF]} END {for(a in S) print a, S[a]}"'
# 觀察 TIME_WAIT 數量穩定在閾值以下
tcp_tw_recycle 在 NAT 環境會導致連接異常(時間戳混亂),Linux 4.12+ 已移除此參數tcp_tw_reuse 僅對客戶端(主動發起連接方)有效