クライアントがサーバーに接続しているときに、クライアントでこの「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
}