我正在全新的Windows 2008 64位计算机上运行负载测试。 加载器是一个Java Applet,它使用HttpURLConnection将请求发送到正在侦听ServerSocket.accept()的服务器,加载器和服务器都在同一台机器上运行。
在我的旧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 backlog设置为256,看起来它没有用尽。 机器cpu利用率低于10%,服务器有足够的可用内存。 使用Visual VM观察客户端和服务器,看起来两者在问题发生时都正常运行。 有什么想法吗?
答案 0 :(得分:0)
由于缺少其他资源,服务器可能拒绝连接?每个HTTP请求都需要打开TCP连接,这在Linux下使用'file'(我不是Linux专家,所以如果我错了请纠正我)。因此,有时CPU和内存很低,但HTTP服务器会打开数百个文件,最终导致失败,任何进一步的请求都将被拒绝。
我不确定这是否适用于Windows,但请试一试。
答案 1 :(得分:0)
2008年施加的一些额外限制不属于以前的版本。我会从这里开始...... http://technet.microsoft.com/en-us/magazine/2007.12.network.aspx