UDP丟包的問題

最近在忙着解決一個UDP丟包的問題。

首先說說環境。

  • 網絡環境很理想,萬兆內網,主機之間使用一臺光纖交換機連接並無任何中間節點;
  • 環境中的所有主機操作系統均爲win2008Server x64 128G,CPU 32核 2.8GHz
  • 一臺主機發送數據(通過UDP組播),其它主機接收
  • 發送數據的主機開啓8路組播端口,每路發送數據很均勻爲51.2MBps。(總數據量爲8*51.2Mbps)
  • 接收數據的主機同樣開啓8路組播端口接收數據。並同時保存數據,需要保證平均每1分鐘以上纔會發生丟包

 問題來了

我在實際測試的時候發現;單獨存儲數據或單獨接收組播數據都能達到要求(存得過來,也能保證丟包率穩定在允許範圍內),但是邊收邊存就會導致丟包率猛增。

解決思路

在看過下面的博文後,得知磁盤IO操作頻繁會導致CPU等待而不能及時處理內核socket緩衝區中的udp數據包 (ps:該文前面所說的MTU限制並不適用於我當前的內網環境)
  1. 該文所說的磁盤IO操作與SOCKET緩衝區的搶奪CPU是否正確?
  2. 是否有方法規避該問題 ,比如單個存儲文件的大小與單次寫入大小是否存在最佳效率?

淺談UDP(數據包長度,收包能力,丟包及進程結構選擇)

=================================================================================

最新進展:

  • 收數端採用完成端口收數
  • 將UDP收發緩衝區設大(之前記得再某個地方看到UDP收發緩衝最多隻能設置64KB,也沒有驗證便相信了,事實證明,WinSock的收發緩衝區沒有這個限制)
  • 升級網卡驅動以及BIOS驅動
  • 內存映射文件視圖設小

    以上設置後,網絡丟包明顯下降,但是否能達到穩定的要求,還需要拭目以待。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章