歡迎您光臨本站 註冊首頁

解決TIME_WAIT過多問題

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

解決TIME_WAIT過多問題

解決TIME_WAIT過多問題







#netstat -n | awk 『/^tcp/ {++S[$NF]} END {for(a in S) print a, S}』

LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122

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

也就是說,這條命令可以把當前系統的網路連接狀態分類匯總。

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

一個簡單的管道符連接了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狀態的連接數

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

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

for(key in state)
遍曆數組

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

如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,
vim /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 讓參數生效。

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 修改系?默認的 TIMEOUT 時間

下面附上TIME_WAIT狀態的意義:

客戶端與伺服器端建立TCP/IP連接后關閉SOCKET后,伺服器端連接的埠
狀態為TIME_WAIT

是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?

主動關閉的一方在發送最後一個 ack 后
就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間
這個是TCP/IP必不可少的,也就是「解決」不了的。

也就是TCP/IP設計者本來是這麼設計的
主要有兩個原因
1。防止上一次連接中的包,迷路后重新出現,影響新連接
(經過2MSL,上一次連接中所有的重複包都會消失)
2。可靠的關閉TCP連接
在主動關閉方發送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發
fin, 如果這時主動方處於 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以
主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。

TIME_WAIT 並不會佔用很大資源的,除非受到攻擊。

還有,如果一方 send 或 recv 超時,就會直接進入 CLOSED 狀態

分享到: QQ空間 騰訊微博 騰訊朋友 分享0 收藏6 0 0 轉發到微博  感謝大家對linuxtone的支持!
  使用道具 舉報
提升卡

置頂卡

沉默卡

喧囂卡

變色卡

顯身卡
  

NetSeek NetSeek 當前離線
註冊時間2008-5-19最後登錄2012-1-4在線時間1753 小時閱讀許可權200積分11951帖子2517主題1196精華24UID1  IP卡  狗仔卡
LT管理團隊

社區首席勤雜工



註冊時間2008-5-19最後登錄2012-1-4在線時間1753 小時閱讀許可權200積分11951帖子2517主題1196精華24UID1

串個門 加好友 打招呼 發消息  2#
發表於 2008-9-8 19:10:01 |只看該作者
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套接字拖死。

注:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

設置這兩個參數: reuse是表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連接; recyse是加速TIME-WAIT sockets回收

《解決方案》

謝謝分享
《解決方案》

學習了,謝謝
《解決方案》

不錯!謝謝
《解決方案》

不錯,對伺服器優化有幫助

[火星人 ] 解決TIME_WAIT過多問題已經有735次圍觀

http://coctec.com/docs/service/show-post-297.html