2012-02-06 43 views
1

私は新しいWindows 2008 64ビットマシンでloadtestを実行しています。 ローダーは、HttpURLConnectionを使用してServerSocket.accept()でリッスンしているサーバーにリクエストを送信するJavaアプレットです。ローダーとサーバーの両方が同じマシン上で実行されています。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を使用してクライアントとサーバーを観察すると、問題の時点​​で両方が正しく機能しているように見えます。 アイデア

+0

更新:私は、64ビットWindowsサーバー上で32ビットJava VMを実行すると、スケーラビリティが約50%低下すると考えました。 64ビットマシンでJavaで使用されるリソースの中には、32ビットマシンに比べて約2倍のメモリが必要なように見えます。私はまだ、この問題が発生したときにどのリソースが使い果たされたのかを正確に把握していません。最終的に64ビットJava VMを使用してコードを実行するようになりましたが、これで問題は解決されました。 – lyaffe

+0

Update2:この問題の根本的な原因は、サーバープロセスが長いガベージコレクションサイクルに陥り、クライアント接続が失敗するということでした。 – lyaffe

答えて

0

多分、サーバーは他のリソースが不足しているため接続を拒否していますか?各HTTP要求は、TCP接続を開く必要があります.Linuxでは 'file'を使用しています(私はLinuxの専門家ではありませんので、私が間違っている場合は修正してください)。したがって、CPUとメモリが低い場合もありますが、HTTPサーバーは何百ものファイルを開き、最終的にはエラーが発生し、それ以上の要求は拒否されます。

これがWindowsにも当てはまるのかどうかはわかりませんが、それは一発です。

関連する問題