千萬別忽視!TIME_WAIT 堆積背后的秘密和應(yīng)對技巧
平時(shí)運(yùn)維過程中,你有沒有遇到過這種情況:服務(wù)器明明沒多少請求,但 netstat -an | grep tcp | grep TIME_WAIT 一看,成千上萬條 TIME_WAIT 堆積,看著被攻擊了一樣。

別慌,這不是 Bug,這就是 TCP 的自我保護(hù)機(jī)制。今天,我?guī)湍銖氐着?TIME_WAIT,順便教你怎么解決它。
1. TIME_WAIT 是什么?
TCP 連接關(guān)閉有個(gè)“四次揮手”的過程:
- 客戶端發(fā) FIN:我要關(guān)閉連接
- 服務(wù)器回 ACK:收到
- 服務(wù)器發(fā) FIN:我也要關(guān)閉
- 客戶端回 ACK
主動關(guān)閉的一方就會進(jìn)入 TIME_WAIT,等待 2×MSL(最大報(bào)文生存時(shí)間),Linux 默認(rèn)大約 60 秒。
為什么要等?保證最后的 ACK 能被對方收到,避免網(wǎng)絡(luò)延遲導(dǎo)致數(shù)據(jù)丟失。
簡單來說,TIME_WAIT 就是 TCP 的“安全休眠模式”。
2. 為什么會產(chǎn)生大量 TIME_WAIT?
可能有以下幾個(gè)原因:
- 短連接頻繁建立:HTTP、Redis、MySQL 的短連接模式,每次請求都是一次開關(guān)機(jī),TIME_WAIT 自然堆積。
- 服務(wù)器主動關(guān)閉:TIME_WAIT 只出現(xiàn)在主動關(guān)閉連接的一方,如果服務(wù)端經(jīng)常主動斷開,而客戶端被動接受,就會堆很多。
- 高并發(fā)環(huán)境:短時(shí)間內(nèi)大量連接關(guān)閉,TIME_WAIT 就像小人潮,堆積在系統(tǒng)里。
3. TIME_WAIT 有啥影響?
如果TIME_WAIT堆積過多,會出現(xiàn)下面的問題:
- 端口耗盡:每個(gè) TIME_WAIT 占用一個(gè)端口,如果端口被短時(shí)間內(nèi)重復(fù)使用,可能會遇到“端口不夠用”的尷尬。
- 占用內(nèi)存:每個(gè) TIME_WAIT 會占用少量內(nèi)存,但 Linux 可以處理大量 TIME_WAIT,一般不會直接 OOM。
換句話說,大量 TIME_WAIT 很正常,不必慌,除非端口用完。
4. 解決方案
(1) TCP 端口重用
允許系統(tǒng)復(fù)用 TIME_WAIT 端口,避免端口耗盡。
sysctl -w net.ipv4.tcp_tw_reuse=1注意:只對客戶端主動發(fā)起連接有效。
(2) 縮短 TIME_WAIT 時(shí)間
減少 TIME_WAIT 保持時(shí)間,加快回收。
sysctl -w net.ipv4.tcp_fin_timeout=30默認(rèn)約 60 秒,時(shí)間太短可能增加重傳風(fēng)險(xiǎn)。
(3) 使用長連接 / 連接池
- HTTP:開啟 Keep-Alive,減少重復(fù)連接
- 數(shù)據(jù)庫:使用連接池復(fù)用連接
以Nginx為例:
keepalive_timeout 65;
keepalive_requests 100;(4) 負(fù)載均衡
使用 Nginx、LVS、HAProxy,把高并發(fā)連接分散到多臺服務(wù)器,減少單臺壓力。
核心思路:減少新連接產(chǎn)生 + 縮短或復(fù)用 TIME_WAIT + 分散壓力
TIME_WAIT 是 TCP 的“安全休眠”,高并發(fā)環(huán)境堆積很正常。掌握以上方法,就能讓 Linux 服務(wù)器更穩(wěn)、更快、更抗壓。
























