netstat下time_wait數過多引起的問題

在做ministored 性能測試的時候,需要儘可能快的發送http請求給server端。因此做了一個循環,讓client不停的發送,中間用usleep來控制發送的頻率,最開始的時候usleep的值設置的很小,結果發現很快Server就不能給client正確的響應,client收不到數據,然後出現了coredump,用netstat -anp |grep 1314以後發現,處於time_wait的鏈接數太多了,有2-3只多。於是分析問題可能是被佔用的套接字太多了,導致server創建不了新的套接字。

 

解決的辦法,在 /etc/sysctl.conf加入下面幾句話

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200   
net.ipv4.ip_local_port_range = 1024    65000   ## 端口分配範圍
net.ipv4.tcp_max_tw_buckets = 5000   ## 設置"time_wait"的桶最多容納5000個

添加完畢以後

sysctl -p 讓以上配置生效

 

一個個解釋下

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。

 

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