下接我上運行新的Windows 2008 64位機品牌負載測試。 加載程序是一個Java Applet,它使用HttpURLConnection將請求發送到在ServerSocket.accept()上偵聽的服務器,加載程序和服務器都在同一臺計算機上運行。java.net.ConnectException:連接被拒絕:負載
在我的舊的Windows 2003服務器,我能夠加載在使用這種配置的1000個用戶。 然而,隨着新的服務器,裝載大約400個會話時加載程序開始拋出以下異常:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:388)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:483)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:213)
at sun.net.www.http.HttpClient.New(HttpClient.java:300)
at sun.net.www.http.HttpClient.New(HttpClient.java:316)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:992)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:928)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:846)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1087)
...
看起來好像服務器或機器運行了一些資源。 ServerSocket積壓被設置爲256,它看起來好像沒有被耗盡。 機器cpu利用率低於10%,並且服務器有足夠的可用內存。 使用Visual VM觀察客戶端和服務器時,它看起來在問題發生時都處於正常運行狀態。 任何想法?
更新:最終我計算過,一個64位Windows服務器上運行的32位Java虛擬機時的可擴展性是通過減少約50%。看起來好像Java在64位計算機上使用的資源相比32位計算機的內存大約是內存的兩倍。在發生此問題時,我仍然沒有準確確定哪些資源已耗盡。最終我們移植了我們的代碼以使用64位Java VM運行,並解決了這個問題。 – lyaffe 2012-10-15 08:40:39
Update2:最後發現這個問題的根本原因是服務器進程停留在冗長的垃圾回收循環中,從而導致客戶端連接失敗。 – lyaffe 2013-09-24 08:34:42