關鍵命令:數組
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
下面解釋一下爲啥要這樣寫:
一個簡單的管道符鏈接了netstat和awk命令。
------------------------------------------------------------------
先來看看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