java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind 一個(gè)朋友讓我?guī)兔鉀Q他服務(wù)器上一個(gè)JAVA應(yīng)用出現(xiàn)的問題,我利用業(yè)務(wù)時(shí)間趕赴現(xiàn)場兩次,終于解決了這個(gè)疑難雜癥,趕緊記錄下來,不求能解救曾經(jīng)和我一樣困惑的勞苦大眾,但愿自己別忘了。 一、問題的表現(xiàn) 首先說明一下環(huán)境,服務(wù)器是WINDOWS SERVER 2003,我對這個(gè)操作系統(tǒng)的特性不是很熟悉,只是當(dāng)做普通的個(gè)人版操作系統(tǒng)來使用。我平時(shí)一般JAVA服務(wù)器都是安裝LINUX。 數(shù)據(jù)庫使用的SQL SERVER 2005,SP2。他的數(shù)據(jù)庫本來是SQL SERVER 2000的,是我上周幫他做的遷移。 中間件使用RESIN 2.1.17,這是我非常喜歡和熟悉的SERVLET容器,加不加裝APACHE都具有很好的WEB服務(wù)性能。 殺毒軟件使用的瑞星,雙網(wǎng)卡,硬件防火墻,什么牌子我沒管。 那到底是什么問題? 這個(gè)! com.microsoft.sqlserver.jdbc.SQLServerException: 到主機(jī) 的 TCP/IP 連接失敗。 java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind RESIN啟動(dòng)后,在短時(shí)間內(nèi)正常,但是在沒有訪問的情況下,會(huì)在幾個(gè)小時(shí)后,自己死掉。靜態(tài)頁面沒有問題,也就是基于HTTPWEB服務(wù)器沒有死,涉及數(shù)據(jù)庫連接的,都不行。 二、分析 我是第一次碰到這個(gè)錯(cuò)誤,趕緊GOOGLE。 我首先自己排除了是程序的問題,網(wǎng)上有人說,是數(shù)據(jù)庫連接沒有關(guān)閉,這樣的同志都是新手,而且我自己也可以肯定,程序是肯定沒有問題的,這個(gè)錯(cuò)誤,出現(xiàn)的位置絕對比數(shù)據(jù)庫連接要底層的多。 網(wǎng)上的文章非常少,都看了一遍,總結(jié)一共有以下幾個(gè)原因。 1. Windows服務(wù)器運(yùn)行自動(dòng)更新。具體為什么自動(dòng)更新運(yùn)行后,就會(huì)消耗系統(tǒng)這么多的SOCKET 連接,我還搞不清楚。但是有一點(diǎn),自動(dòng)更新肯定會(huì)占用網(wǎng)絡(luò)帶寬和CPU,在服務(wù)器上,我覺得應(yīng)該是關(guān)閉自動(dòng)更新的,采用人工更新的方法。 2.機(jī)器中了木馬。木馬會(huì)打開很多后門,創(chuàng)建大量的連接,包括局域網(wǎng)肉雞上的,還有外網(wǎng)的。這也會(huì)導(dǎo)致機(jī)器出現(xiàn)無法上網(wǎng),或者程序無法連接。在搜索到的結(jié)果中,大量的結(jié)果都是采用的SQLSERVER數(shù)據(jù)庫服務(wù)器,這是很容易招來木馬和病毒的服務(wù)器,大部分是SQLSERVER出問題,不是偶然的。 3.虛擬內(nèi)存配置過低。第一次發(fā)現(xiàn)這個(gè)問題后,我到現(xiàn)場打開機(jī)器,確實(shí)報(bào)了一個(gè)虛擬內(nèi)存的錯(cuò)誤,說虛擬內(nèi)容不足。 4.有不當(dāng)程序創(chuàng)建了大量的短連接,由于程序的不健壯,導(dǎo)致SOCKET處于忙碌或者TIME_WAIT狀態(tài),或者服務(wù)器和客戶端有一方出現(xiàn)異常,而另一方?jīng)]有得到通知,還在連接,持續(xù)不斷的做寫操作。 三、動(dòng)手解決 經(jīng)過分析,將準(zhǔn)備采取的措施一一寫下來,我的腦袋不太好用,容易忘記東西。 措施如下,先做什么,后做什么,看到這篇文章的朋友,可以自己調(diào)整。 1. 優(yōu)化RESIN的配置,適當(dāng)?shù)臄U(kuò)大連接池的數(shù)量,雖然不是這個(gè)問題,還是稍微擴(kuò)大一點(diǎn)。配置了遠(yuǎn)程監(jiān)控,關(guān)閉了默認(rèn)沒有做的目錄瀏覽,屏蔽了404等錯(cuò)誤;使用HTTPD -INSTALL將RESIN安裝入服務(wù),原來我的朋友是直接啟動(dòng)的控制臺(tái),這容易導(dǎo)致程序在控制臺(tái)緩存到頂后停止。關(guān)閉了HIBERNATE的SHOW_SQL開關(guān)。 2.關(guān)閉自動(dòng)更新,并且關(guān)閉Background Intelligent Transfer Service服務(wù)。打開服務(wù)的時(shí)候,發(fā)現(xiàn)服務(wù)窗口5秒后會(huì)自動(dòng)關(guān)閉,而且奇怪的服務(wù)非常多。同時(shí)看到NORTON已經(jīng)被自動(dòng)禁用了,打也打不開,得,這機(jī)器的病毒還不少。 3.殺毒。不看不知道,一看嚇一跳。我這哥們真是個(gè)大猛男,媽的,各種病毒都中了,還服務(wù)呢,這SERVER真是可憐?。〔×酥魅艘膊唤o看病,為國家服務(wù)的機(jī)器,不可能沒有醫(yī)保嘛。親爸不管叔叔來給你治病。經(jīng)過分析,中的病毒有U盤病毒,還有RUNAUTO..病毒,灰鴿子,傳奇木馬,各種不知名的后門和木馬,還被安裝了一個(gè)遠(yuǎn)程控制的小東西。下載了一個(gè)360,想偷懶,結(jié)果根本無法安裝。刪除了RUNAUTO..,(我以前的博客有專門描述怎么對付這玩意的)結(jié)果C盤都打不開了,只能在資源管理器中打開。還挺麻煩。于是找到病毒幾個(gè)藏身之所,分析了未知服務(wù),用DOS刪除不掉,還是360的文件粉碎有用。什么c:\windows\lsass.exe等等,cmd.exe.exe這都太普通了。具體過程也不是很清楚了,總之最后360可以安裝并更新了。360這東西確實(shí)好,木馬都清除了?,F(xiàn)在服務(wù)窗口也不自動(dòng)關(guān)閉了,NORTON也正常監(jiān)控,機(jī)器沒有異常打開的端口,沒有莫名其妙的服務(wù),恩,差不多了。 4.優(yōu)化服務(wù)器設(shè)置。其實(shí)我也不知道這么優(yōu)化??戳丝?,虛擬內(nèi)存都在C盤,C盤空間已經(jīng)非常少了,找了點(diǎn)看的明白的東西,往別的盤搬了搬,看不懂的,不敢隨便給人家動(dòng)。重新打開服務(wù)窗口,沒什么用的服務(wù)都開著,把我確定的都關(guān)閉,什么SERVER服務(wù),還開著ADMIN$呢,趕緊都關(guān)了,他這機(jī)器根本用不著。還有什么IIS,APACHE,開的還真全,我看還安裝了TOMCAT了,干脆加上RESIN全打開算了,那真是夠熱鬧的,萬馬齊喑。我當(dāng)然不允許這事出現(xiàn),全干掉。 5.檢查是否某個(gè)程序有漏洞。由于我自己在RESIN下還配置了一個(gè)只有我自己連GOOGLE的機(jī)器人都無法發(fā)現(xiàn)(并且也拒絕了機(jī)器人掃描)的小工具,之前就看到有外網(wǎng)IP不時(shí)的創(chuàng)建大量的連接,但都處于TIME_WAIT狀態(tài)。這也很要命??戳艘幌拢诉@個(gè)WEB應(yīng)用,還有一個(gè)每天自動(dòng)接收數(shù)據(jù)的小程序。這個(gè)程序是使用的SOCKET長連接還是短連接就不知道了,有朋友關(guān)心這方面的內(nèi)容可以詳細(xì)GOOGLE一下。但是這個(gè)程序確實(shí)是沒有被配置為開機(jī)自動(dòng)運(yùn)行(我給加上了),可能是外網(wǎng)那個(gè)IP上的客戶端在不斷的尋求連接吧!SOCKET.close()是不馬上釋放連接的,而是設(shè)置為TIME_WAIT狀態(tài),這個(gè)時(shí)間默認(rèn)是240S,也就是4分鐘。這太長了,有30秒(最小值)就可以了。在修改這個(gè)默認(rèn)值的時(shí)候,還發(fā)現(xiàn)這臺(tái)機(jī)器并沒有開啟大端口服務(wù),也就是高于5000的端口。這也是會(huì)出現(xiàn)“系統(tǒng)缺乏足夠緩沖區(qū)空間或者因?yàn)殛?duì)列已滿無法執(zhí)行套接字上操作”錯(cuò)誤的!而那WEB服務(wù)就是配置到1萬以上端口的!趕緊,操作方法如下: 1. 啟動(dòng)注冊表編輯器。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 值名稱:MaxUserPort 新建 值名稱:TCPTimedWaitDelay OK! 經(jīng)過一番折騰,我在震耳欲聾的轟鳴聲中,終于安撫了這臺(tái)哭泣的服務(wù)器,也馴服了幾匹小木馬,好好調(diào)教了我的RESIN服務(wù)器。順便說一句,我身后有臺(tái)什么愛默生服務(wù)器,隔一會(huì)就象打嗝似的叫一聲,時(shí)常把我嚇到…… 希望花費(fèi)我1個(gè)多小時(shí)寫的這個(gè)總結(jié),對我自己肯定有用,也希望能幫到更多的朋友,如果轉(zhuǎn)載,請注明出處。 (本博文來自向日蘑菇的——三十而悟,地址http://giscool.blog.163.com/blog/static/56088547200810151151355) |
|