我使用的产品使用Boost ASIO(TCP)进行网络通信。在测试过程中,我注意到一些非常奇怪的事情:ASIO会以~60MB / s的速度发送13秒然后降低到~300K / s持续9秒然后它会回到~60MB / s持续13秒;这将重复整个转移。我写了一个测试应用程序,看看我是否可以重现这一点,令我惊讶的是,我可以。
在我的测试应用程序中,客户端和服务器连接后代码非常基本。值得注意的是,阻塞和非阻塞套接字产生相同的结果。以下是服务器在阻塞情况下接收数据的方式:
while(true)
{
boost::system::error_code ec;
serverSocket.read_some(boost::asio::buffer(serverBuffer, bufferLength), ec);
}
客户端执行此操作:
while(true)
boost::asio::write(clientSocket, boost::asio::buffer(clientBuffer, bufferLength)
如果bufferLength是4K,我看到了问题,但如果我把它推到32K,传输速度很快(> 120MB / s)并且一致。
任何人都可以了解可能发生的事情吗?这是在Windows Server 2008上运行的Windows应用程序。
编辑:我做了Wireshark捕获,有时会延迟> 150ms的服务器发送ACK。即客户端发送最后一位数据[PSH,ACK];服务器在150ms之后用[ACK]重新响应。中间没有其他流量。
2nd Edit:我写了一个展示相同行为的C#应用程序。客户端使用NetworkStream.Write发送4k数据包,服务器使用NetworkStream.Read读取它们。关于从哪里去的任何建议?
答案 0 :(得分:0)
我不知道你的程序究竟是什么。但是我在150ms的一次旅行中得到了你的wirehark的信息。这是不正常的。我认为你应该检查网卡是否在同一模式下工作。双工或半双工,100M或1000M。然后,检查错误包计数器,它应该是0或非常小的数字。如果它是一个很大的数字,并随着您的C / S通信而增加。你应该换电缆。
我希望它可以帮到你。 :)
答案 1 :(得分:0)
您是否尝试禁用Nagle的算法(tcp :: no_delay)? 还尝试更改缓冲区大小。
socket->set_option( boost::asio::ip::tcp::no_delay( true) );
socket->set_option( boost::asio::socket_base::send_buffer_size( 65536 ) );
socket->set_option( boost::asio::socket_base::receive_buffer_size( 65536 ) );