解決linux下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:等待所有分組死掉

發現系統存在大量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數量快速下降。


------------------------------------------------------------------

下面解釋一下爲啥要這樣寫:

一個簡單的管道符連接了netstatawk命令。

------------------------------------------------------------------

先來看看netstat:

netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT

你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。

------------------------------------------------------------------

再來看看awk:

/^tcp/
濾出tcp開頭的記錄,屏蔽udp, socket等無關記錄。

state[]相當於定義了一個名叫state的數組

NF
表示記錄的字段數,如上所示的記錄,NF等於6

$NF
表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT

state[$NF]表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數

++state[$NF]表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一

END
表示在最後階段要執行的命令

for(key in state)
遍歷數組

print key,"\t",state[key]打印數組的鍵和值,中間用\t製表符分割,美化一下。 


netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章