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