0

クライアントがサーバーに接続しているときに、クライアントでこの「java.net.ConnectException: Connection timed out」例外が発生しています。

それらはすべて同じ LAN 内、同じクラスター内にあり、その間にファイアウォールはありません。また、多かれ少なかれ1000クライアントまで問題なく動作します。1200 クライアントを起動すると、それらの多く (数百) がサーバーへの接続時にタイムアウトします。各クライアントはサーバーにリクエストを送信し続けるため、サーバーに CPU 負荷がかかります。これは、2 つのスレッドで約 100% になります。

サーバーを追加したり、タイムアウトを増やしたりせずに、この問題を回避するにはどうすればよいですか? 私もやったsudo sysctl -w net.core.somaxconn=2048が、役に立たなかった。

サーバーへの接続に NIO を使用しています。

SocketChannel serverChannel = SocketChannel.open();
serverChannel.connect(new InetSocketAddress(serverAddr, serverPort));
serverObjectOutStream = new ObjectOutputStream(Channels.newOutputStream(serverChannel));
serverObjectInStream  = new ObjectInputStream (Channels.newInputStream (serverChannel));

サーバーに関しては:

while (running) {
   SocketChannel newClientChannel = serverSocketChannel.accept();
   ObjectInput  cliInput  = new ObjectInputStream (Channels.newInputStream (newClientChannel));
   ObjectOutput cliOutput = new ObjectOutputStream(Channels.newOutputStream(newClientChannel));
   // receive client's id and put it in a hashtable of id -> in,out channels
   // acknowledge the client
}
4

2 に答える 2

0

ネットワークの負荷を確認してください。これらすべてのクライアントで NIC の使用率が 100% に達していますか? また、100% の CPU がボトルネックになる可能性があります。これをチェックしてください。詳細はあまり説明しませんが、OSを微調整する必要があるかどうかも確認してください。

ハードウェアを除外する場合は、ソフトウェアをチェックします。

基本的に、あなたが持っているのはC10Kの問題です。ここにそれについての本当に良い読み物があります(より多くの読み物へのリンク付き) http://www.kegel.com/c10k.html

于 2013-09-16T18:20:27.300 に答える