作者:Horizonfeng_121 | 来源:互联网 | 2023-09-05 17:02
最近在忙着解决一个UDP丢包的问题。
首先说说环境。
- 网络环境很理想,万兆内网,主机之间使用一台光纤交换机连接并无任何中间节点;
- 环境中的所有主机操作系统均为win2008Server x64 128G,CPU 32核 2.8GHz
- 一台主机发送数据(通过UDP组播),其它主机接收
- 发送数据的主机开启8路组播端口,每路发送数据很均匀为51.2MBps。(总数据量为8*51.2Mbps)
- 接收数据的主机同样开启8路组播端口接收数据。并同时保存数据,需要保证平均每1分钟以上才会发生丢包
问题来了
我在实际测试的时候发现;单独存储数据或单独接收组播数据都能达到要求(存得过来,也能保证丢包率稳定在允许范围内),但是边收边存就会导致丢包率猛增。
解决思路
在看过下面的博文后,得知磁盘IO操作频繁会导致CPU等待而不能及时处理内核socket缓冲区中的udp数据包 (ps:该文前面所说的MTU限制并不适用于我当前的内网环境)
- 该文所说的磁盘IO操作与SOCKET缓冲区的抢夺CPU是否正确?
- 是否有方法规避该问题 ,比如单个存储文件的大小与单次写入大小是否存在最佳效率?
浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)
=================================================================================
最新进展:
- 收数端采用完成端口收数
- 将UDP收发缓冲区设大(之前记得再某个地方看到UDP收发缓冲最多只能设置64KB,也没有验证便相信了,事实证明,WinSock的收发缓冲区没有这个限制)
- 升级网卡驱动以及BIOS驱动
- 内存映射文件视图设小
以上设置后,网络丢包明显下降,但是否能达到稳定的要求,还需要拭目以待。