今天發現linux機器無法用ssh串連並且上了機器也不能ping了,後面通過netstat -anp | grep TIME_WAIT | wc -l 命令查看數量發現有大量TIME_WAIT串連了,下面我們一起來看看出現大量TIME_WAIT問題解決方案。
word-spacing: 0px; -webkit-text-stroke-width: 0px; -webkit-text-size-adjust: auto">現象:
1、外部機器不能正常串連SSH
2、內向外不能夠正常的ping通過,網域名稱也不能正常解析。
問題排查:
通過 netstat -anp | grep TIME_WAIT | wc -l 命令查看數量,發現TIME_WAIT的串連數量超過了18000太誇張了。
1、初步懷疑是程式沒有關閉串連,codereview了兩遍,發現,已經正常關閉。
2、網上看TIME_WAIT產生的原因,可能是因為伺服器主動關閉串連導致TIME_WAIT產生。
3、尋找TIME_WAIT解決方案:
pse: separate; font-family: Tahoma; white-space: normal; orphans: 2; letter-spacing: normal; font-weight: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; -webkit-text-size-adjust: auto; -webkit-text-decorations-in-effect: none">發現系統存在大量TIME_WAIT狀態的串連,通過調整核心參數解決,
vi /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
然後執行 /sbin/sysctl -p 讓參數生效。
經過配置後,暫時的問題是解決了,再查看TIME_WAIT數量快速下降。
關鍵命令:
1、netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'
會得到類似下面的結果,具體數字會有所不同:
LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669
狀態:描述
CLOSED:無串連是活動的或進行中
LISTEN:伺服器在等待進入呼叫
SYN_RECV:一個串連請求已經到達,等待確認
SYN_SENT:應用已經開始,開啟一個串連
ESTABLISHED:正常資料轉送狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
2、sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
欄位說明: 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 = 30 表示如果通訊端由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。 net.ipv4.tcp_keepalive_time = 1200 表示當keepalive起用的時候,TCP發送keepalive訊息的頻度。預設是2小時,改為20分鐘。 net.ipv4.ip_local_port_range = 1024 65000 表示用於向外串連的連接埠範圍。預設情況下很小:32768到61000,改為1024到65000。 net.ipv4.tcp_max_syn_backlog = 8192 表示SYN隊列的長度,預設為1024,加大隊列長度為8192,可以容納更多等待串連的網路連接數。 net.ipv4.tcp_max_tw_buckets = 5000 表示系統同時保持 TIME_WAIT通訊端的最大數量,如果超過這個數字,TIME_WAIT通訊端將立刻被清除並列印警告資訊。預設為180000,改為5000。對於Apache、Nginx等伺服器,上幾行的參數可以很好地減少TIME_WAIT通訊端數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT通訊端的最大數量,避免Squid伺服器被大量的TIME_WAIT通訊端拖死。 剛才列印出來的資料: TIME_WAIT 80
FIN_WAIT1 9
ESTABLISHED 317
FIN_WAIT2 710 :由net.ipv4.tcp_fin_timeout = 30決定,此時保持30秒,計算了一下,有130個http連結,5秒重新整理一次,130*(30/5)=780,基本符合。
SYN_RECV 2
CLOSING 1
LAST_ACK 1