gpt4 book ai didi

java - 本地主机上的 java 套接字性能缓慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:03 25 4
gpt4 key购买 nike

我正在构建一个简单的 Java 网络应用程序,但遇到了性能问题。
该应用程序非常简单,包含 2 个部分 ( source code ):

  • 作为主线程的服务器。
  • 客户端是主线程启动的新线程。

我正在尝试发送大量小数据,但最大发送速率为每秒 50 个数据包。
所以在我的搜索中我找到了this question有同样的问题。
当我将缓冲流添加到输出流时,速率变大(每秒千次)
在 wireshark 中,我可以非常清楚地看到区别:

  • 在慢速运行中有push flag,在不同的包中有ack flag,有些ack甚至可以达到45毫秒的延迟,cpu使用率非常低。
  • 在快速运行中,所有包都同时包含 push 和 ack,所有延迟不超过 1 毫秒,CPU 使用率很高。

我也发现了这个相关的question这没有帮助。

为什么这么简单的一行代码却如此不同?
为什么 java 中的简单解决方案这么慢?

最佳答案

套接字在历史上是使用 Nagle's algorithm 打开的已启用,它会延迟小数据包以尝试优化网络通信。

当处理小数据包时,您应该设置TCP_NODELAY 套接字选项。在 Java 中,您可以通过调用 socket.setTcpNoDelay(true);

来实现

调整后我得到:

  • 12000 数据包/秒,无缓冲区
  • 26000 数据包/秒,带缓冲区

我调整后的代码:

public class Test {
static DataOutputStream cout(Socket s) throws IOException {
return new DataOutputStream( (s.getOutputStream()));
// return new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));
}
static DataInputStream cin(Socket s) throws IOException {
return new DataInputStream( (s.getInputStream()));
}
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket server = new ServerSocket(12345);
new Thread(() -> {
try {
Thread.sleep(1000);
Socket client = new Socket("127.0.0.1", 12345);
client.setTcpNoDelay(true);
DataOutputStream out = cout(client);
DataInputStream in = cin(client);
long tm1 = System.currentTimeMillis();
int lastCount = 0;
for (int i=0;i<300000;i++) {
int a = in.readInt();
out.writeInt(a);
out.flush();
long tm2 = System.currentTimeMillis();
if ((tm2 - tm1) >= 1000) {
System.out.println(i - lastCount);
lastCount = i;
tm1 += 1000;
}
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}).start();
Socket client=server.accept();
client.setTcpNoDelay(true);
DataOutputStream out = cout(client);
DataInputStream in = cin(client);
for (int i=0;i<300000;i++){
out.writeInt(i);
out.flush();
if (i!=in.readInt()){
System.out.println("ERROR");
}
}
client.close();
server.close();
Thread.sleep(1000);
}
}

关于java - 本地主机上的 java 套接字性能缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53658245/

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