當 Linux 系統的 TCP 連接數達到 2 萬,且 /proc/net/sockstat
中的 tcp_tw
(TIME_WAIT 連接)、tcp_alloc
(已分配但未完全建立的連接)和 tcp_inuse
(正在使用的連接)均處于高位時,可能會引發以下問題:
一、關鍵指標分析
通過 /proc/net/sockstat
可以查看 TCP 連接狀態:
cat /proc/net/sockstat
輸出類似:
TCP: inuse 20000 orphan 0 tw 15000 alloc 5000 mem 100
tcp_inuse
(inuse):已建立或正在使用的連接(ESTABLISHED 狀態)。tcp_tw
(tw):處于 TIME_WAIT 狀態的連接(等待關閉的殘留連接)。tcp_alloc
(alloc):已分配但尚未完成三次握手的連接(可能處于 SYN_RECV/SYN_SENT 狀態)。
二、潛在問題及原因
1. 端口耗盡(Port Exhaustion)
- 問題:
當tcp_tw
過高時,大量 TIME_WAIT 連接會占用本地端口。客戶端頻繁建立短連接時,可能因可用端口不足而無法發起新連接。 - 觸發條件:
- 客戶端主動關閉連接(如 HTTP 短連接),導致本地端口進入 TIME_WAIT 狀態。
- 端口范圍過小(
net.ipv4.ip_local_port_range
默認 32768-60999,僅約 2.8 萬個端口)。
- 典型錯誤:
connect() failed: Cannot assign requested address (EADDRNOTAVAIL)
2. 內存占用過高
- 問題:
每個 TCP 連接需要內核內存存儲元數據(如 socket 結構體、讀寫緩沖區等)。- 單條連接內存占用約 3-4 KB&#x