Java slow socket.connect() -
below source code of client , server. client connects (concurrently) server , immediatly closes connection. when threads done, waits 2 minutes , connects again. confused fact simple connect needs around 3 seconds! of time connect needs around 0-32ms.
here typical output client:
... connect 23 [ms]: 16 connect 22 [ms]: 32 connect 21 [ms]: 32 connect 15 [ms]: 32 connect 14 [ms]: 16 connect 13 [ms]: 16 connect 11 [ms]: 32 connect 25 [ms]: 3016 this seems happen if client , server on different hosts. windows , linux comparable behaviour java 1.6.23
to start server 2 parameters needed: [port] [thread pool size]
to start client 3 parameters needed: [host] [port] [thread pool size]
for example used 150 thread pool size server , 25 thread pool size client.
can explain behaviour?
----- server -----
package de.test.server;  import java.io.ioexception; import java.io.inputstream; import java.net.serversocket; import java.net.socket; import java.util.concurrent.executorservice; import java.util.concurrent.executors;  public class serverapp {     public static void main(string[] args) throws ioexception {       system.out.println("server running...");        final int port = integer.parseint(args[0]);       final int threads = integer.parseint(args[1]);       final executorservice executorservice = executors             .newfixedthreadpool(threads);       serversocket serversocket = new serversocket(port);       while (true) {          final socket clientsocket = serversocket.accept();           executorservice.execute(new runnable() {             @override             public void run() {                try {                   inputstream = clientsocket.getinputstream();                   int read = is.read();                   if (read != -1) {                      system.out.println("should not happen");                   }                } catch (ioexception e) {                   throw new runtimeexception(e);                } {                   close(clientsocket);                   system.out.println("connection closed");                }             }              private void close(final socket connection) {                try {                   connection.close();                } catch (ioexception e1) {                   throw new runtimeexception(e1);                }             };          });       }    } } ----- client -----
package de.test.client;  import java.io.ioexception; import java.net.inetsocketaddress; import java.net.socket; import java.net.unknownhostexception; import java.util.concurrent.countdownlatch; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.atomic.atomiclong;  public class connectapp {     public static void main(string[] args) throws interruptedexception {       final string host = args[0];       final int port = integer.parseint(args[1]);       final int thread_count = integer.parseint(args[2]);        final executorservice executorservice = executors             .newfixedthreadpool(thread_count);       final atomiclong threadcounter = new atomiclong(0);       while (true) {          final countdownlatch donesignal = new countdownlatch(thread_count);          (int = 0; < thread_count; i++) {             executorservice.execute(new runnable() {                @override                public void run() {                   socket socket = null;                   try {                      long start = system.currenttimemillis();                      socket = new socket();                       socket.settcpnodelay(true);                      socket.connect(new inetsocketaddress(host, port));                      system.out.println(socket.gettcpnodelay());                      long stop = system.currenttimemillis();                      system.out.println("connect "                            + threadcounter.incrementandget() + " [ms]: "                            + (stop - start));                   } catch (unknownhostexception e) {                      throw new runtimeexception(e);                   } catch (ioexception e) {                      throw new runtimeexception(e);                   } {                      close(socket);                      donesignal.countdown();                   }                 }                 private void close(socket socket) {                   try {                      if (socket != null)                         socket.close();                   } catch (ioexception e1) {                      throw new runtimeexception(e1);                   }                }             });          }          donesignal.await();          system.out.println("waiting 2 minutes...");          thread.sleep(1000 * 60 * 2);       }    } } 
all sockets trying connect @ once. since trying connect same single threaded server, 1 accept, 50 (by default) in backlog , reset may not connect or have wait particularly long time.
i suggest trying 40 ms spacing between attempting connect see if problem.
btw: call threadcounter.incrementandget() why going , down?  use
for (int = 0; < thread_count; i++) {     final int threadcount = i; 
Comments
Post a Comment