延迟从Java到同一台机器的多个TCP连接

前端之家收集整理的这篇文章主要介绍了延迟从Java到同一台机器的多个TCP连接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
(见 this question in ServerFault)

我有一个使用Socket的Java客户机打开到同一台机器的并发连接.我目睹一个请求完成的速度非常快,但其他请求的延迟为100-3000毫秒.使用Wireshark的数据包检查显示所有SYN数据包超过第一次等待很久才离开客户端.我在Windows和Linux客户端都看到这一点.可能是什么原因造成的?当客户端是Windows 2008或Linux框时,会发生这种情况.

代码附件:

  1. import java.util.*;
  2. import java.net.*;
  3.  
  4. public class Tester {
  5. public static void main(String[] args) throws Exception {
  6. if (args.length < 3) {
  7. usage();
  8. return;
  9. }
  10. final int n = Integer.parseInt(args[0]);
  11. final String ip = args[1];
  12. final int port = Integer.parseInt(args[2]);
  13.  
  14. ExecutorService executor = Executors.newFixedThreadPool(n);
  15.  
  16. ArrayList<Callable<Long>> tasks = new ArrayList<Callable<Long>>();
  17. for (int i = 0; i < n; ++i)
  18. tasks.add(new Callable<Long>() {
  19. public Long call() {
  20. Date before = new Date();
  21. try {
  22. Socket socket = new Socket();
  23. socket.connect(new InetSocketAddress(ip,port));
  24. }
  25.  
  26. catch (Throwable e) {
  27. e.printStackTrace();
  28. }
  29. Date after = new Date();
  30. return after.getTime() - before.getTime();
  31. }
  32. });
  33. System.out.println("Invoking");
  34. List<Future<Long>> results = executor.invokeAll(tasks);
  35. System.out.println("Invoked");
  36. for (Future<Long> future : results) {
  37. System.out.println(future.get());
  38. }
  39. executor.shutdown();
  40. }
  41.  
  42. private static void usage() {
  43. System.out.println("Usage: prog <threads> <url/IP Port>");
  44. System.out.println("Examples:");
  45. System.out.println(" prog tcp 10 127.0.0.1 2000");
  46. }
  47. }

更新 – 如果在运行测试程序之前清除相关ARP条目,则问题会一再重现.我试过调整TCP retransmission timeout,但这没有帮助.此外,我们将该程序移植到.Net,但问题仍然发生.

更新2 – 3秒是从RFC 1122创建新连接的指定延迟.我仍然不完全明白为什么这里有一个重传,它应该由MAC层处理.此外,我们使用netcat重现了这个问题,所以与java无关.

解决方法

看起来您使用单个底层的HTTP连接.因此,在HttpURLConnection的InputStream调用close()之前,其他请求无法完成,i.即在处理响应之前.

或者你应该使用一个HTTP连接池.

猜你在找的Java相关文章