2011-12-22 72 views
1

我寫了java服務器應用程序,它可以同時接受3800-4000網絡連接,並且cpu /網絡負載很低(< 40%) 但是在此閾值之後它會拒絕新的連接或通過殺死舊的接受它,所以活連接計數約爲3800-4000(數量不同)。服務器重置新連接,但CPU /網絡負載低

任何人都可以給我至少一個提示什麼可以是一個瓶頸在這裏 - 我的軟件本身,操作系統配置或CPU/NAT(不管他們說他們裝載少於40%的事實)?

CPU:4核(一個內核被加載50%,其他3 - 25%) 環境:亞馬遜EC2,Windows Server 2003的R2

編輯: 內存使用小於500 MB JRE是32bit,1.6.0_30 MaxUserPort設置爲65534

+1

你看過你的內存使用情況了嗎? – 2011-12-22 18:01:05

+0

哪個版本的Java? 32或64位體系結構? – 2011-12-22 18:03:18

+0

內存使用量小於500 Mb JRE是32bit,1.6.0_30 – Rage 2011-12-23 10:41:59

回答

0

我認爲你受限於本地動態端口的數量,這是在win *上的4000附近。 Win *註冊表中有許多參數也可以限制併發連接的數量。見列表this article

+0

感謝您的文章,但如果您的意思是[HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters] MaxUserPort默認爲5000 - 我已將它設置爲65534啓動服務器之前。我嘗試了其他參數 - 但它沒有改變整體結果 – Rage 2011-12-23 11:30:02

+0

我注意到你正在使用Java 1.6.0_30。您是否嘗試通過VisualVM查看您的服務器?有什麼有趣的嗎? – mazaneicha 2011-12-23 16:31:41

0

它拒絕新的連接

正確的。一旦TCP積壓隊列被填充,將不會接受其他連接。 Windows將發出RST,其他平臺將忽略傳入的請求。在第一種情況下,客戶會得到'連接被拒絕',在第二種情況下,客戶會'連接超時'。

或者接受它殺掉舊

我從來沒有見過,在超過20年的網絡建設。導致你得出這個結論的症狀是什麼?

+0

我正在對我的服務器軟件進行壓力測試,並在客戶端計算機上運行多個進程(每臺服務器都有數百個連接到服務器)。當總連接數大約爲3800,並且我運行新的客戶端進程時,舊進程的線程數會減少。因此,我總結了服務器重置舊連接(死亡線程數量〜新進程中新創建線程的數量)。是的,我可能在這裏錯了,因爲我沒有看到任何連接相關的錯誤,只是線程數。 – Rage 2011-12-23 10:41:03

+0

其實我得到'連接重置',而不是'連接被拒絕'。 – Rage 2011-12-23 14:16:19