我工作的產品使用Boost ASIO(TCP)進行網絡通信。在測試過程中,我發現一些非常奇怪的東西:ASIO會以〜60MB/s的速度發送13秒,然後降至〜300K/s的9秒,然後再回到〜60MB /秒的速度,持續13秒;這將重複整個轉移。我寫了一個測試應用程序,看看我是否可以重現這一點,令我驚訝的是,我可以。Boost ASIO將發送速度很快然後很慢
在我的測試應用程序中,客戶端和服務器連接後的代碼非常基本。值得注意的是,阻塞和非阻塞套接口產生相同的結果。這裏是服務器的阻塞情況如何接收數據:
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的延遲> 150ms。即客戶端發送最後一位數據[PSH,ACK];服務器在150ms後以[ACK]響應。之間沒有其他交通。
第二編輯:我寫了一個C#應用程序展現相同的行爲。客戶端使用NetworkStream.Write發送4k數據包,服務器使用NetworkStream.Read讀取它們。任何關於從哪裏去的建議?
是什麼讓你這個行爲是由asio庫而不是網絡堆棧和/或網絡本身造成的? –
偉大的問題,我不知道它是肯定的ASIO。我非常有信心,這不是網絡;兩臺測試機直接連接。它可能是網絡堆棧,但我不太確定如何證明它是。 (我的背景不在網絡中)。 – BigHands79
'boost :: asio'使用底層操作系統特定的網絡堆棧,從而證明您的發現在您的C#應用程序中存在相同的問題。您是否設置了套接字緩衝區大小('ioctl SO_SNDBUF/SO_RCVBUF')? – Chad