最近在忙着解決一個UDP丟包的問題。
首先說說環境。
- 網絡環境很理想,萬兆內網,主機之間使用一臺光纖交換機連接並無任何中間節點;
- 環境中的所有主機操作系統均爲win2008Server x64 128G,CPU 32核 2.8GHz
- 一臺主機發送數據(通過UDP組播),其它主機接收
- 發送數據的主機開啓8路組播端口,每路發送數據很均勻爲51.2MBps。(總數據量爲8*51.2Mbps)
- 接收數據的主機同樣開啓8路組播端口接收數據。並同時保存數據,需要保證平均每1分鐘以上纔會發生丟包
問題來了
解決思路
- 該文所說的磁盤IO操作與SOCKET緩衝區的搶奪CPU是否正確?
- 是否有方法規避該問題 ,比如單個存儲文件的大小與單次寫入大小是否存在最佳效率?
=================================================================================
最新進展:
- 收數端採用完成端口收數
- 將UDP收發緩衝區設大(之前記得再某個地方看到UDP收發緩衝最多隻能設置64KB,也沒有驗證便相信了,事實證明,WinSock的收發緩衝區沒有這個限制)
- 升級網卡驅動以及BIOS驅動
- 內存映射文件視圖設小
以上設置後,網絡丟包明顯下降,但是否能達到穩定的要求,還需要拭目以待。