我工作的产品使用 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 读取它们。关于从这里去哪里有什么建议吗?