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

沒有留言:

張貼留言