公司服務器最近幾天一直報錯誤,大概運行一天就報以下異常。java
java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bindweb
搞的非常鬱悶,轉載篇文章,貌似很全面,試試看。sql
一個朋友讓我幫忙解決他服務器上一個JAVA應用出現的問題,我利用業務時間趕赴現場兩次,終於解決了這個疑難雜症,趕忙記錄下來,不求能解救曾經和我同樣困惑的勞苦大衆,希望本身別忘了。數據庫
1、問題的表現小程序
首先說明一下環境,服務器是WINDOWS SERVER 2003,我對這個操做系統的特性不是很熟悉,只是當作普通的我的版操做系統來使用。我平時通常JAVA服務器都是安裝LINUX。windows
數據庫使用的SQL SERVER 2005,SP2。他的數據庫原本是SQL SERVER 2000的,是我上週幫他作的遷移。緩存
中間件使用RESIN 2.1.17,這是我很是喜歡和熟悉的SERVLET容器,加不加裝APACHE都具備很好的WEB服務性能。sass
殺毒軟件使用的瑞星,雙網卡,硬件防火牆,什麼牌子我沒管。服務器
那究竟是什麼問題?網絡
這個!
com.microsoft.sqlserver.jdbc.SQLServerException: 到主機 的 TCP/IP 鏈接失敗。 java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind
RESIN啓動後,在短期內正常,可是在沒有訪問的狀況下,會在幾個小時後,本身死掉。靜態頁面沒有問題,也就是基於HTTPWEB服務器沒有死,涉及數據庫鏈接的,都不行。
2、分析
我是第一次碰到這個錯誤,趕忙GOOGLE。
我首先本身排除了是程序的問題,網上有人說,是數據庫鏈接沒有關閉,這樣的同志都是新手,並且我本身也能夠確定,程序是確定沒有問題的,這個錯誤,出現的位置絕對比數據庫鏈接要底層的多。
網上的文章很是少,都看了一遍,總結一共有如下幾個緣由。
1. Windows服務器運行自動更新。具體爲何自動更新運行後,就會消耗系統這麼多的SOCKET 鏈接,我還搞不清楚。可是有一點,自動更新確定會佔用網絡帶寬和CPU,在服務器上,我以爲應該是關閉自動更新的,採用人工更新的方法。
2.機器中了木馬。木馬會打開不少後門,建立大量的鏈接,包括局域網肉雞上的,還有外網的。這也會致使機器出現沒法上網,或者程序沒法鏈接。在搜索到的結果中,大量的結果都是採用的SQLSERVER數據庫服務器,這是很容易招來木馬和病毒的服務器,大部分是SQLSERVER出問題,不是偶然的。
3.虛擬內存配置太低。第一次發現這個問題後,我到現場打開機器,確實報了一個虛擬內存的錯誤,說虛擬內容不足。
4.有不當程序建立了大量的短鏈接,因爲程序的不健壯,致使SOCKET處於忙碌或者TIME_WAIT狀態,或者服務器和客戶端有一方出現異常,而另外一方沒有獲得通知,還在鏈接,持續不斷的作寫操做。
3、動手解決
通過分析,將準備採起的措施一一寫下來,個人腦殼不太好用,容易忘記東西。
措施以下,先作什麼,後作什麼,看到這篇文章的朋友,能夠本身調整。
1. 優化RESIN的配置,適當的擴大鏈接池的數量,雖然不是這個問題,仍是稍微擴大一點。配置了遠程監控,關閉了默認沒有作的目錄瀏覽,屏蔽了404等錯誤;使用HTTPD -INSTALL將RESIN安裝入服務,原來個人朋友是直接啓動的控制檯,這容易致使程序在控制檯緩存到頂後中止。關閉了HIBERNATE的SHOW_SQL開關。
2.關閉自動更新,而且關閉Background Intelligent Transfer Service服務。打開服務的時候,發現服務窗口5秒後會自動關閉,並且奇怪的服務很是多。同時看到NORTON已經被自動禁用了,打也打不開,得,這機器的病毒還很多。
3.殺毒。不看不知道,一看嚇一跳。我這哥們真是個大猛男,媽的,各類病毒都中了,還服務呢,這SERVER真是可憐啊!病了主人也不給看病,爲國家服務的機器,不可能沒有醫保嘛。親爸無論叔叔來給你治病。通過分析,中的病毒有U盤病毒,還有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個多小時寫的這個總結,對我本身確定有用,也但願能幫到更多的朋友,轉載請註明鏈接!