1. 程式人生 > >網路伺服器-解決伺服器大量TIME_WAIT而無法訪問的方法

網路伺服器-解決伺服器大量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

執行以下命令使之生效

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回收

以下引數說明來此網路: