2014年6月5日 星期四
Windows中存在大量CLOSE_WAIT
CLOSE_WAIT狀態的生成原因
如果是CLIENT端主動斷掉當前連接的話,那麼雙方關閉這個TCP連接共需要四個p:
Client ---> FIN ---> Server ## Client 送出 Fin封包給Server
Client <--- ACK <--- Server ## Server 收到結束請求後,會送出確認結束封包給Client端
這時候Client端處於FIN_WAIT_2狀態;而Server 程序處於CLOSE_WAIT狀態。
程序: Client ---> FIN ---> Server
狀態: FIN_WAIT_2 //CLIENT送出結束請求封包FIN, 等待Server的結束請求ACK封包
這時Server 發送FIN給Client,Server 就成為LAST_ACK狀態。
程序: Client <--- ACK <--- Server
狀態: FIN_WAIT_2 LAST_ACK // Server 回覆CLIENT端的結束請求ACK封包
Client回應了ACK,那麼Server 才會成為CLOSED狀態。
程序: Client ---> ACK ---> Server
狀態: CLOSED // CLIENT 回覆SERVER ACK封包
Linux調效方式
預設設定
tcp_fin_timeout 180
tcp_keepalive_time 7200
tcp_window_scaling 1
tcp_sack 1
tcp_timestamps 1
建議值
修改方式1 編輯 /etc/sysctl.conf ,修改下列設定值:
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
#Turn off tcp_timestamps
net.ipv4.tcp_timestamps = 0
修改方式2 編輯 /etc/rc.local , 加入下列設定 :
echo "30">/proc/sys/net/ipv4/tcp_fin_timeout
echo "1800">/proc/sys/net/ipv4/tcp_keepalive_time
echo "0">/proc/sys/net/ipv4/tcp_window_scaling
echo "0">/proc/sys/net/ipv4/tcp_sack
echo "0">/proc/sys/net/ipv4/tcp_timestamps
上述的設定能增加平台可處理的 TCP/IP 連接的數量,縮短服務器在終止失效連接前的等待時間.
參數說明:
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套接字拖死。
執行以下命令使配置生效:
/sbin/sysctl -p
http://blogs.msdn.com/b/spike/archive/2008/10/09/tcp-connections-hanging-in-the-close-wait-and-fin-wait-2-state.aspx
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言