2011-01-24 59 views
3

所以基本上在標題中描述了該問題。 服務器工作在以下方式:Java多線程套接字服務器在獲得約50個同時連接後掛起連接

  • 監聽到一個新的連接
  • 一旦連接請求 - 將請求發送到Q,
  • 繼續偵聽新的連接
  • 獨立的過程需要關心Q併產生一個新線索來處理客戶的要求。

服務器代碼類似於this tutorial(一切都在try/catch語句,遺憾的是我不能顯示源代碼 - 公司政策)

這似乎很好地工作,直到客戶端的數量超過〜50,然後掛起,沒有例外/警告/等等。有一個32k的cpu線程限制,對打開的文件/打開的套接字/等的數量沒有限制。OS = CentOS 5.5(同樣的情況發生在ubuntu tho )。服務器使用ODBC將數據記錄到MySQL。單獨的壓力測試表明,我可以有多達32k的java進程(受/ proc/sys/kernel/threads-max限制),MySQL可以執行高達20k次的簡單操作/秒,所以我假設問題出在插槽。

所以,真正的問題是:

  • 什麼是套接字連接的限制因素,我怎麼可以把它做大?
  • 或者我看錯了地方?
+0

嗨,那你的意思,當你說:「其實它與java.io.DataInputStream中的一個問題.readByte() - 它得到一個意想不到的EOF並掛起然後「 - 你能顯示出問題是什麼以及你做了什麼來解決它? – phobus 2011-03-17 09:13:10

+0

@phobus嗨,問題是客戶端停止發送它要發送的字符串(連接問題/延遲等),服務器正在等待字符串的其餘部分(直到找到定義的EOF)才能執行某些操作。我沒有修復它,我寧願修改它,所以它只會讀取它找到的內容,例如: `int available = streamIn.available(); while(available> 0) \t { \t \t byte cr = streamIn.readByte(); \t \t如果(CR == EOF) \t \t { \t \t \t中斷; \t \t} \t \t myString + =(char)cr; \t \t可用 - ; \t}` – Sigtran 2011-03-18 11:15:31

+0

對不起,它在評論部分看起來不太好,但它的可讀性好,我希望你明白。 – Sigtran 2011-03-18 11:18:59

回答

5

您有可能在代碼中的某處導致了死鎖。這裏的關鍵指標是,如果通過「掛起」,您的意思是服務器的CPU使用率下降爲零,並且服務器中沒有看到進一步的活動。

當服務器掛起運行jdk tool: jstack反對它的過程。這應該告訴你什麼是等待什麼鎖。工具包中還有jvisualvm,如果在unix盒子上,簡單的kill -3 pid將執行到stderr的線程轉儲。

無法使用代碼或至少可重現的示例,恐怕我無法提供更多幫助。你可能想要看的一件事是使用jetty作爲你的嵌入式服務器而不是一個手工的服務器,它們已經經歷了死鎖/線程化的痛苦,所以你不必這樣做。

0

不知道這是否會幫助你,如果你正在使用它,但嘗試運行你的套接字服務器與Java開關「-server」,這將選擇Java HotSpot服務器虛擬機。關於優化JIT以及其他一些「服務器級」設置。一般來說,您可以通過此設置獲得最佳性能。默認的VM是-client。

還要檢查你的其他參數,可以使以最少的資源
您的套接字服務器鴕鳥政策運行有一個愉快的一天

相關問題