問題原由:web
本身開發了一個服務器和客戶端,經過短鏈接的方式來進行通信,因爲過於頻繁的建立鏈接,致使系統鏈接數量被佔用,不能及時釋放。看了一下18888,當時嚇到了。服務器
現象:cookie
一、外部機器不能正常鏈接SSHtcp
二、內向外不可以正常的ping經過,域名也不能正常解析。spa
問題排查:.net
經過 netstat -anp | grep TIME_WAIT | wc -l 命令查看數量,發現TIME_WAIT的鏈接數量超過了18000太誇張了。code
一、初步懷疑是程序沒有關閉鏈接,codereview了兩遍,發現,已經正常關閉。orm
二、網上看TIME_WAIT產生的緣由,多是由於服務器主動關閉鏈接致使TIME_WAIT產生。ip
三、查找TIME_WAIT解決方案:ci
發現系統存在大量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數量快速降低。
關鍵命令:
一、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:等待全部分組死掉
二、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