0

我工作的产品使用 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 捕获,有时服务器发送 ACK 的延迟大于 150 毫秒。即客户端发送最后一位数据[PSH,ACK];服务器在 150 毫秒后回复 [ACK]。中间没有其他流量。

第二次编辑:我编写了一个表现相同行为的 C# 应用程序。客户端使用 NetworkStream.Write 发送 4k 数据包,服务器使用 NetworkStream.Read 读取它们。关于从这里去哪里有什么建议吗?

4

2 回答 2

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 ) );
于 2014-04-03T08:15:23.160 回答
0

我不知道你的程序到底是什么。但我得到了你的wireshark 的消息,单程150 毫秒。这是不正常的。我认为您应该检查网卡是否在相同模式下工作。双工或半双工,100M 或 1000M。然后,检查错误包计数器,它应该是 0 或一个很小的数字。如果它是一个很大的数字并且随着您的 C/S 通信而增加。你应该改变你的电缆。

我希望它可以帮助你。:)

于 2013-10-18T04:10:06.630 回答