解決linux下time_wait過多的問題

關鍵命令:數組


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


會獲得相似下面的結果,具體數字會有所不一樣:bash

LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669
服務器

狀態:描述cookie

CLOSED:無鏈接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個鏈接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個鏈接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另外一邊已贊成釋放
ITMED_WAIT:等待全部分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另外一邊已初始化一個釋放
LAST_ACK:等待全部分組死掉
socket

發現系統存在大量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 讓參數生效。

tcp


通過配置後,暫時的問題是解決了,再查看TIME_WAIT數量快速降低。ide


------------------------------------------------------------------spa

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

一個簡單的管道符鏈接了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]}'code

相關文章
相關標籤/搜索