我正在构建一个简单的java网络应用程序,我遇到了一个性能问题。
该应用程序非常简单,包含两部分(源代码):
作为主线程的服务器。
客户端是由main启动的新线程。
我试图发送大量的小数据,但最大发送速率是每秒50包。
所以在我的研究中,我发现这个问题和同样的问题。
当我将缓冲流添加到输出流时,速率会变大(每秒千次)
在wireshark中,我可以很清楚地看到不同之处:
在慢运行时有push标志,在不同的包中有ack标志,有的ack甚至可以达到45毫秒的延迟,cpu使用率很低。
在快速运行中,所有包都包含push和ack,所有这些包的延迟都不超过1毫秒,cpu使用率很高。
我还发现这个相关的问题没有帮助。
为什么这一行简单的代码会有如此大的不同?
为什么java中的简单解决方案这么慢?
1条答案
按热度按时间bpzcxfmw1#
在历史上,套接字是使用nagle算法打开的,它会延迟小数据包以优化网络通信。
处理小包时,应设置
TCP_NODELAY
插座选项。在java中,您可以通过调用socket.setTcpNoDelay(true);
调整后我得到:12000包/秒,无缓冲区
26000包/秒,带缓冲区
我的调整代码: