java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind

來源:互聯網
上載者:User

一個朋友讓我幫忙解決他伺服器上一個JAVA應用出現的問題,我利用業務時間趕赴現場兩次,終於解決了這個疑難雜症,趕緊記錄下來,不求能解救曾經和我一樣困惑的勞苦福士,但願自己別忘了。

一、問題的表現

首先說明一下環境,伺服器是WINDOWS SERVER 2003,我對這個作業系統的特性不是很熟悉,只是當做普通的個人版作業系統來使用。我平時一般JAVA伺服器都是安裝LINUX。

資料庫使用的SQL SERVER 2005,SP2。他的資料庫本來是SQL SERVER 2000的,是我上周幫他做的遷移。

中介軟體使用RESIN 2.1.17,這是我非常喜歡和熟悉的SERVLET容器,加不加裝APACHE都具有很好的WEB服務效能。

殺毒軟體使用的瑞星,雙網卡,硬體防火牆,什麼牌子我沒管。

那到底是什麼問題?

這個!

com.microsoft.sqlserver.jdbc.SQLServerException: 到主機  的 TCP/IP 串連失敗。 java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind

RESIN啟動後,在短時間內正常,但是在沒有訪問的情況下,會在幾個小時後,自己死掉。靜態頁面沒有問題,也就是基於HTTPWEB伺服器沒有死,涉及資料庫連接的,都不行。

二、分析

我是第一次碰到這個錯誤,趕緊GOOGLE。

我首先自己排除了是程式的問題,網上有人說,是資料庫連接沒有關閉,這樣的同志都是新手,而且我自己也可以肯定,程式是肯定沒有問題的,這個錯誤,出現的位置絕對比資料庫連接要底層的多。

網上的文章非常少,都看了一遍,總結一共有以下幾個原因。

1. Windows伺服器運行自動更新。具體為什麼自動更新運行後,就會消耗系統這麼多的SOCKET 串連,我還搞不清楚。但是有一點,自動更新肯定會佔用網路頻寬和CPU,在伺服器上,我覺得應該是關閉自動更新的,採用人工更新的方法。

2.機器中了木馬。木馬會開啟很多後門,建立大量的串連,包括區域網路肉雞上的,還有外網的。這也會導致機器出現無法上網,或者程式無法串連。在搜尋到的結果中,大量的結果都是採用的SQLSERVER資料庫伺服器,這是很容易招來木馬和病毒的伺服器,大部分是SQLSERVER出問題,不是偶然的。

3.虛擬記憶體配置過低。第一次發現這個問題後,我到現場開啟機器,確實報了一個虛擬記憶體的錯誤,說虛擬內容不足。

4.有不當程式建立了大量的短串連,由於程式的不健壯,導致SOCKET處於忙碌或者TIME_WAIT狀態,或者伺服器和用戶端有一方出現異常,而另一方沒有得到通知,還在串連,持續不斷的做寫操作。

三、動手解決

經過分析,將準備採取的措施一一寫下來,我的腦袋不太好用,容易忘記東西。

措施如下,先做什麼,後做什麼,看到這篇文章的朋友,可以自己調整。

1. 最佳化RESIN的配置,適當的擴大串連池的數量,雖然不是這個問題,還是稍微擴大一點。配置了遠程監控,關閉了預設沒有做的瀏覽目錄,屏蔽了404等錯誤;使用HTTPD -INSTALL將RESIN安裝入服務,原來我的朋友是直接啟動的控制台,這容易導致程式在控制台緩衝到頂後停止。關閉了HIBERNATE的SHOW_SQL開關。

2.關閉自動更新,並且關閉Background Intelligent Transfer Service服務。開啟服務的時候,探索服務視窗5秒後會自動關閉,而且奇怪的服務非常多。同時看到NORTON已經被自動禁用了,打也打不開,得,這機器的病毒還不少。

3.殺毒。不看不知道,一看嚇一跳。我這哥們真是個大猛男,媽的,各種病毒都中了,還服務呢,這SERVER真是可憐啊!病了主人也不給看病,為國家服務的機器,不可能沒有醫保嘛。親爸不管叔叔來給你治病。經過分析,中的病毒有隨身碟病毒,還有RUNAUTO..病毒,灰鴿子,傳奇木馬,各種不知名的後門和木馬,還被安裝了一個遠端控制的小東西。下載了一個360,想偷懶,結果根本無法安裝。刪除了RUNAUTO..,(我以前的部落格有專門描述怎麼對付這玩意的)結果C盤都打不開了,只能在資源管理員中開啟。還挺麻煩。於是找到病毒幾個藏身之所,分析了未知服務,用DOS刪除不掉,還是360的檔案粉碎有用。什麼c:/windows/lsass.exe等等,cmd.exe.exe這都太普通了。具體過程也不是很清楚了,總之最後360可以安裝並更新了。360這東西確實好,木馬都清除了。現在服務視窗也不自動關閉了,NORTON也正常監控,機器沒有異常開啟的連接埠,沒有莫名其妙的服務,恩,差不多了。

4.最佳化伺服器設定。其實我也不知道這麼最佳化。看了看,虛擬記憶體都在C盤,C盤空間已經非常少了,找了點看的明白的東西,往別的盤搬了搬,看不懂的,不敢隨便給人家動。重新開啟服務視窗,沒什麼用的服務都開著,把我確定的都關閉,什麼SERVER服務,還開著ADMIN$呢,趕緊都關了,他這機器根本用不著。還有什麼IIS,APACHE,開的還真全,我看還安裝了TOMCAT了,乾脆加上RESIN全開啟算了,那真是夠熱鬧的,萬馬齊喑。我當然不允許這事出現,全乾掉。

5.檢查是否某個程式有漏洞。由於我自己在RESIN下還配置了一個只有我自己連GOOGLE的機器人都無法發現(並且也拒絕了機器人掃描)的小工具,之前就看到有外網IP不時的建立大量的串連,但都處於TIME_WAIT狀態。這也很要命。看了一下,除了這個WEB應用,還有一個每天自動接收資料的小程式。這個程式是使用的SOCKET長串連還是短串連就不知道了,有朋友關心這方面的內容可以詳細GOOGLE一下。但是這個程式確實是沒有被配置為開機自動運行(我給加上了),可能是外網那個IP上的用戶端在不斷的尋求串連吧!SOCKET.close()是不馬上釋放串連的,而是設定為TIME_WAIT狀態,這個時間預設是240S,也就是4分鐘。這太長了,有30秒(最小值)就可以了。在修改這個預設值的時候,還發現這台機器並沒有開啟大連接埠服務,也就是高於5000的連接埠。這也是會出現“系統缺乏足夠緩衝區空間或者因為隊列已滿無法執行通訊端上操作”錯誤的!而那WEB服務就是配置到1萬以上連接埠的!趕緊,操作方法如下:

1. 啟動登錄編輯程式。 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
2. 建立

值名稱:MaxUserPort
實值型別: DWORD
值資料: 65534(用十進位的方法寫進去就可以,如果是十六進位,是FFFE,因為4個F是65535嘛)
有效範圍: 5000 - 65534 (十進位)
預設: 0x1388 5000 (十進位)

建立

值名稱:TCPTimedWaitDelay
實值型別: DWORD
值資料: 0000001e(也就是30,不行可以用WINDOWS計算機,很方便,這個表示TIME_WAIT的秒數)

OK!

經過一番折騰,我在震耳欲聾的轟鳴聲中,終於安撫了這台哭泣的伺服器,也馴服了幾匹小木馬,好好調教了我的RESIN伺服器。順便說一句,我身後有台什麼愛默生伺服器,隔一會就象打嗝似的叫一聲,時常把我嚇到……

希望花費我1個多小時寫的這個總結,對我自己肯定有用,也希望能幫到更多的朋友,如果轉載,請註明出處。

(本博文來自向日蘑菇的——三十而悟,地址http://giscool.blog.163.com/blog/static/56088547200810151151355)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.