網絡服務器-解決服務器大量TIME_WAIT而無法訪問的方法

日前我的一個Server和Client之間的通信協議採用了Json Over HTTP的方式(並且在同一個機器上面,其實應該是出現在Client的那個機器上),而且由於Client的實現原因,沒有任何KeepAlive機制,同時必須有大量的請求,這樣就造成一個問題,客戶端的請求端口會迅速被使用完成,然後系統會有大量的TIME_WAIT,整個系統再也分配不出新的端口給任何程序(包括Client)使用,任何新創建連接時,都會報錯,即:"Cannot assign requested address”,經過反覆測試,可以採用以下的方式解決:

 

編輯 /etc/sysctl.conf 文件,增加以下內容

net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 60000000
net.ipv4.netfilter.ip_conntrack_max = 268435456
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 1


執行以下命令使之生效

/sbin/sysctl -p


重點備註:

net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 1

1.reuse是表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連接,我這裏是不重用,這樣配合下面的參數可以讓系統迅速回收,反而效果比設置爲1要好很多;

2.recyse是加速TIME-WAIT sockets回收

 

以下參數說明來此網絡:

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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章