首先说说环境。
- 网络环境很理想,万兆内网,主机之间使用一台光纤交换机连接并无任何中间节点;
- 环境中的所有主机操作系统均为win2008Server x64 128G,CPU 32核 2.8GHz
- 一台主机发送数据(通过UDP组播),其它主机接收
- 发送数据的主机开启8路组播端口,每路发送数据很均匀为51.2MBps。(总数据量为8x51.2Mbps)
- 接收数据的主机同样开启8路组播端口接收数据。并同时保存数据,需要保证平均每1分钟以上才会发生丢包
- 编码使用C++ WIN32API,磁盘存储使用的内存映射,单个文件最多存储1GB。(内存映射文件应该是效率最高的存储了吧?)
问题来了
我在实际测试的时候发现;单独存储数据或单独接收组播数据都能达到要求(存得过来,也能保证丢包率稳定在允许范围内),但是边收边存就会导致丢包率猛增。
解决思路
在看过下面的博文后,得知磁盘IO操作频繁会导致CPU等待而不能及时处理内核socket缓冲区中的udp数据包 (ps:该文前面所说的MTU限制并不适用于我当前的内网环境)
该文所说的磁盘IO操作与SOCKET缓冲区的抢夺CPU是否正确?
是否有方法规避该问题 ,比如单个存储文件的大小与单次写入大小是否存在最佳效率?
浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)http://www.cnblogs.com/linuxbug/p/4906000.html