下接我上运行新的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