詳解TIME_WAIT過多,引起的請求502的問題。


最近線上出現請求調用502的問題,A服務調用B服務偶然拋502錯誤,出現的頻率也比較低。排查問題發現是請求的TIME_WAIT狀態過多造成的。

什么是TIME_WAIT?

 
tcp關閉連接

TIME_WAIT: TCP關閉連接中請求的發起方收到了接收方的FIN報文,並發送出了ACK報文,這時進入TIME_WAIT狀態,2MSL后變成CLOSED狀態了。

TIME_WAIT的作用是什么

(1)在進行關閉連接四路握手協議時,最后的ACK是由主動關閉端發出的,如果這個最終的ACK丟失,服務器將重發最終的FIN,因此客戶端必須維護狀態信息允 許它重發最終的ACK。如果不維持這個狀態信息,那么客戶端將響應RST分節,服務器將此分節解釋成一個錯誤(在java中會拋出connection reset的SocketException)。因而,要實現TCP全雙工連接的正常終止,必須處理終止序列四個分節中任何一個分節的丟失情況,主動關閉 的客戶端必須維持狀態信息進入TIME_WAIT狀態。
(2)允許老的重復分節在網絡中消逝
TCP分節可能由於路由器異常而“迷途”,在迷途期間,TCP發送端可能因確認超時而重發這個分節,迷途的分節在路由器修復后也會被送到最終目的地,這個 原來的迷途分節就稱為lost duplicate。在關閉一個TCP連接后,馬上又重新建立起一個相同的IP地址和端口之間的TCP連接,后一個連接被稱為前一個連接的化身 (incarnation),那么有可能出現這種情況,前一個連接的迷途重復分組在前一個連接終止后出現,從而被誤解成從屬於新的化身。為了避免這個情 況,TCP不允許處於TIME_WAIT狀態的連接啟動一個新的化身,因為TIME_WAIT狀態持續2MSL,就可以保證當成功建立一個TCP連接的時 候,來自連接先前化身的重復分組已經在網絡中消逝。

如何解決TIME_WAIT過多問題

在只有一台客戶端和一台web服務器的情況下。構建一條TCP連接需要四個值
<源IP地址 ,源端口,目標IP地址,目的端口> ,其中三個都是固定的,只有源端口號是可以改變的。
客戶端每次請求服務端的時候,都會獲取一個新的源端口,以實現連接的唯一性。但由於原端口的數量是有限的(如果僅有6000個),而且在2MSL(等於120)秒內無法重復使用.因此最大連接並發數為6000/120=500次/秒。
因此解決問題的方法可以分為三種:

1:使端口可重復使用

2:減少TIME_WAIT的等待時間

3:使用負載均衡策略,增加可用端口

如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決:
編輯文件/etc/sysctl.conf,加入以下內容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000

然后執行 /sbin/sysctl -p 讓參數生效。

net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout 修改系默認的 TIMEOUT 時間
net.ipv4.ip_local_port_range = 1024 65000 表示用於向外連接的端口范圍


作者:jiang_liu
鏈接:https://www.jianshu.com/p/102fdb8cccb7
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM