Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化简单的套接字通信?_Java_Performance_Sockets_Network Protocols - Fatal编程技术网

Java 如何优化简单的套接字通信?

Java 如何优化简单的套接字通信?,java,performance,sockets,network-protocols,Java,Performance,Sockets,Network Protocols,客户端发送一条消息。服务器读取消息并写入回复。客户阅读回复。重复一遍。每条消息都少于500字节。插座未关闭 我在局域网上的两台台式电脑之间每秒收到大约800个请求+响应。主机上的网络活动几乎不明显 如果我不执行readReply(或在单独的线程中执行),吞吐量会爆炸到30.000 msg/秒或更高!这也会使主机上的网络活动达到高峰 我的问题是: 对于单个套接字上的请求/响应协议而言,800 msg/sec是合理的数字吗 删除readReply调用如何提高这样的性能 除了使用UDP,还可以做些什么

客户端发送一条消息。服务器读取消息并写入回复。客户阅读回复。重复一遍。每条消息都少于500字节。插座未关闭

我在局域网上的两台台式电脑之间每秒收到大约800个请求+响应。主机上的网络活动几乎不明显

如果我不执行
readReply
(或在单独的线程中执行),吞吐量会爆炸到30.000 msg/秒或更高!这也会使主机上的网络活动达到高峰

我的问题是:

  • 对于单个套接字上的请求/响应协议而言,800 msg/sec是合理的数字吗

  • 删除readReply调用如何提高这样的性能

  • 除了使用UDP,还可以做些什么来改善这一点?可能使用的其他协议

  • 服务器:

    while (true) {
       message = readMessage();
       writeReply("Thanks");
    }
    
    客户:

    while (true) {
       writeMessage("A message");
       reply = readReply();
    }
    
    注:

    • 我在Java和Php中实现了这一点,得到了大致相同的结果

    • Ping延迟是基本问题是延迟:网络帧/包到达目的地所需的时间

      例如,1毫秒延迟将速度限制为最多1000帧/秒。2毫秒的延迟可以处理500 fps,10毫秒可以处理100 fps等

    • 在这种情况下,当延迟为0.5毫秒时,预计将管理1600 fps(800*2)

    • 我认为这是因为您能够在每帧发送更多数据。不过,它会在一段时间后填充客户端中的TCP缓冲区

    • 如果可能,批处理(管道)消息。从客户端批量发送10条消息,然后等待服务器回复。服务器也应该在一个块中发送所有10个回复。理论上,这将使速度提高10倍


    • 一个建议是阻塞套接字上的等待。如果readReply()必须等待另一端“唤醒-停止阻塞”,然后读取套接字,然后发送一个应答,那么readReply()将阻塞,只会在应答出现之前花费时间。等待时间取决于两侧量子片的持续时间以及cpu执行其他进程的繁忙程度。如果ping时间约为1ms,每秒800条消息(实际上是1600条,因为您是双向的)大约是您可以获得的最大消息数。使用UDP对您没有帮助,因为数据包在TCP/UDP/IP堆栈上下移动的时间比在网络上花费的时间要长得多。如果您想提高性能,请实施一些滑动窗口协议:发送方在等待第一个答复之前最多发送20条消息。@jimmcnamara“等待是双方量子片持续时间的函数”,仅当双方都过载时,即准备线程多于核心。由于网络延迟和nagle算法的原因,OP的性能为99.99%。您可以通过管道发送请求吗?在发送请求2之前,客户端是否必须等待服务器对请求1的答复?