gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:30:37 25 4
gpt4 key购买 nike

(参见 this question in ServerFault)

我有一个 Java 客户端,它使用 Socket 打开与同一台机器的并发连接。我目睹了一种现象,一个请求完成得非常快,但其他请求却延迟了 100-3000 毫秒。使用 Wireshark 的数据包检查显示所有 SYN 数据包在离开客户端之前先等待很长时间。我在 Windows 和 Linux 客户端上都看到了这一点。是什么原因造成的?当客户端是 Windows 2008 或 Linux 机器时会发生这种情况。

附加代码:

import java.util.*;
import java.net.*;

public class Tester {
public static void main(String[] args) throws Exception {
if (args.length < 3) {
usage();
return;
}
final int n = Integer.parseInt(args[0]);
final String ip = args[1];
final int port = Integer.parseInt(args[2]);

ExecutorService executor = Executors.newFixedThreadPool(n);

ArrayList<Callable<Long>> tasks = new ArrayList<Callable<Long>>();
for (int i = 0; i < n; ++i)
tasks.add(new Callable<Long>() {
public Long call() {
Date before = new Date();
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port));
}

catch (Throwable e) {
e.printStackTrace();
}
Date after = new Date();
return after.getTime() - before.getTime();
}
});
System.out.println("Invoking");
List<Future<Long>> results = executor.invokeAll(tasks);
System.out.println("Invoked");
for (Future<Long> future : results) {
System.out.println(future.get());
}
executor.shutdown();
}

private static void usage() {
System.out.println("Usage: prog <threads> <url/IP Port>");
System.out.println("Examples:");
System.out.println(" prog tcp 10 127.0.0.1 2000");
}
}

更新 - 如果我在运行测试程序之前清除相关的 ARP 条目,问题会持续重现。我试过调整 TCP retransmission timeout ,但这没有帮助。另外,我们将此程序移植到.Net,但问题仍然存在。

更新 2 - 3 秒是创建新连接的指定延迟,来自 RFC 1122 .我还是不太明白这里为什么要重传,应该是MAC层处理的。另外,我们使用netcat重现了这个问题,所以它与java无关。

最佳答案

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

或者您应该使用 HTTP 连接池。

关于java - 从 Java 到同一台机器的多个 TCP 连接延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com