2013-10-17 56 views
0

我工作的產品使用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讀取它們。任何關於從哪裏去的建議?

+0

是什麼讓你這個行爲是由asio庫而不是網絡堆棧和/或網絡本身造成的? –

+0

偉大的問題,我不知道它是肯定的ASIO。我非常有信心,這不是網絡;兩臺測試機直接連接。它可能是網絡堆棧,但我不太確定如何證明它是。 (我的背景不在網絡中)。 – BigHands79

+1

'boost :: asio'使用底層操作系統特定的網絡堆棧,從而證明您的發現在您的C#應用​​程序中存在相同的問題。您是否設置了套接字緩衝區大小('ioctl SO_SNDBUF/SO_RCVBUF')? – Chad

回答

0

我不知道你的程序到底是什麼。但是我已經爲你的wireshark一次150毫秒的旅行。這是不正常的。我認爲你應該檢查網卡是否工作在相同的模式。雙工或半雙工,100M或1000M。然後,檢查錯誤包計數器,它應該是0或非常小的數字。如果它是一個很大的數字並且隨着你的C/S通信而增加。你應該改變你的電纜。

我希望它能幫助你。 :)

+0

這似乎不是一個答案 –

+0

我的意思是你可以檢查NIC設置和系統ENV,有時它會導致問題。在您的程序中找不到任何問題。 :P – Chair

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)); 
相關問題