關於 No buffer space available (maximum connections reached?): connect 的處理


一、問題

 

hudson一個應用打包部署一直不成功,檢查報錯

檢查項目的JOB配置,開始以為是SVN的問題,但是重啟SVN后問題一直存在

 

 

 二、分析:

      TCP協議中,關閉TCP連接的是Server端(當然,關閉都可以由任意一方發起),當Server端發起關閉連接請求時,向Client端發送一個FIN報文,Client端收到FIN報文時,很可能還有數據需要發送,所以並不會立即關閉SOCKET,所以先回復一個ACK報文,告訴Server端,“你發的FIN報文我收到了”。當Client端的所有報文都發送完畢之后,Client端向Server端發送一個FIN報文,此時Client端進入關閉狀態,不在發送數據。 

       Server端收到FIN報文后,就知道可以關閉連接了,但是網絡是不可靠的,Client端並不知道Server端要關閉,所以Server端發送ACK后進入TIME_WAIT狀態,如果Client端沒有收到ACK則Server段可以重新發送。Client端收到ACK后,就知道可以斷開連接了。Server端等待了2MSL(Max Segment Lifetime,最大報文生存時間)后依然沒有收到回復,則證明Client端已正常斷開,此時,Server端也可以斷開連接了。2MSL的TIME_WAIT等待時間就是由此而來

 

三、解決:

1.查了資料發現是進程雖然結束了,但是有很多TIME_WAIT狀態的連接未釋放

 

 

2 查看hudson所在的windows服務器上

①IME_WAIT的自動關閉時間(默認4分鍾)

②windows下的大端口服務(雖然系統總共可使用的Ports有65536個,但從本機連到外部網路(Outbound Connections)的連線埠最多只會使用到5000個而已【此為系統默認值】)

操作如下:

 

3.重啟

 

四、結論

由於大量的TIME_WAIT連接未被釋放,導致占用的端口資源一直未被回收,出現了緩沖區空間不足的問題,應用也總是自動斷線。

 

附:LINUX更改socket連接數與TIMEOUT時間

修改系統socket最大連接數

在文件/etc/security/limits.conf最后加入下面兩行:

* soft nofile 32768

* hard nofile 32768

 

縮小2MSL的時長、允許重用處於TIME_WAIT狀態的TCP連接、快速回收處於 TIME_WAIT狀態的TCP連接

修改/etc/sysctl.conf,添加如下幾行:

 

#改系統默認的TIMEOUT時間
net.ipv4.tcp_fin_timeout=2

#啟重用,允許將TIME_WAIT sockets重新用於新的TCP連接 默認為0表示關閉
net.ipv4.tcp_tw_reuse=1

#開啟TCP連接中TIME_WAIT sockets的快速回收 默認為0 表示關閉
net.ipv4.tcp_tw_recycle=1

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM