局域网UDP丢包优化
来源:互联网 发布:ubuntu怎么配置输入法 编辑:程序博客网 时间:2024/05/13 02:18
之前一直没考虑清楚为何接收到UDP数据丢包的问题,当意识到这造成很大问题时便狂查资料,有以下结论:
1.发送方发送的数据太快,导致UDP输入队列溢出(系统会丢掉一些包),在应用程序看来是即是丢包。
解决方法:
1.想办法提高应用程序对UDP包的处理速度。
2.提高UDP输入队列缓冲区大小,可通过setsockopt的SO_RCVBUF来进行设置,但是这里的设置还受限于系统的设置,
在linux系统下可以通过设置系统最大缓冲区来设定:
在 /etc/sysctl.conf 中加入
net.core.rmem_max = 131071 //最大值,有资料说甚至可以设置为10M或更大
net.core.rmem_default = 112640//默认值
设置后重启可通过:sysctl -a |grep net.core 查看
论证例子:
题: buf = x; 接收速度,奇数秒:y byte/s。偶数秒:0byte/s;处理速度:z byte/s;问buf 多久会满?
解: (1).当x<=y-z时,第一秒就会满。
(2)当x>y-z时,x = (y/2 - z)*t.得出t = (2*x)/(y-2*z).
2.1 当 y < 2*z时,t无大于0的解。(即buf永远不会满)
2.2 当y>2*z时, t = (2*x)/(y-2*z).
若要使buf永远不满:
(1)的解决办法为,增大x,z。减小y.
(2.2)的解决办法是减小y,还有增大z。
无论如何,最终要使数据满足2.1的情况。
由此得出结论,首先满足基本条件即不可以让第一次发送的高峰期就将缓冲区填满,降低发送方的发送速度,加快处理速度均会使缓冲区达到不满的状态。
一个线程接收,一个线程处理并不会提高处理速度,只是变相的增大了缓冲区大小,将系统缓冲区转移到了自己的缓冲区。
2.当然最愚蠢的错误就是将recvfrom中的buf_size设置小了。
3.局域网里丢包率也是很小的,并且未经过路由器,不会乱序,如果在到达网卡之前就丢包了,那就要检查网络状况,当然也可以通过ethtool设置网卡信息提高接收成功率。网上还有提到NAPI可以提高网卡处理效率,通过使用轮询降低中断次数。
参考资料:
TCP/IP详解(协议卷)
linux性能调优
http://www.stamhe.com/?p=270
- 局域网UDP丢包优化
- UDP大批量传输数据时的丢包问题优化
- UDP丢包
- UDP丢包
- UDP丢包----转载
- UDP丢包
- UDP丢包
- udp丢包
- UDP丢包问题
- UDP丢包原因
- UDP丢包
- UDP丢包原因
- UDP丢包原因
- UDP丢包原因
- UDP丢包原因
- UDP丢包原因
- UDP 丢包
- udp丢包
- 标称电阻值(转) 常用的5%和1%精度电阻的标称值
- TTL和CMOS(转)
- 黑马程序员 Java面向对象——IO流(字节流读取流)
- volatile用法
- 黑马程序员 Java面向对象——IO流(字节流缓冲区)
- 局域网UDP丢包优化
- jquery之empty()与remove()区别
- 黑马程序员 Java面向对象——IO流(字节流键盘读取)
- jQuery get content between <div> tags
- 星期天怎么没人啊
- sencha touch实例:微博设置界面
- apache commons组件学习之FileUpload
- ASP.NET AJAX(开发代号Atlas)重要参考资源大收集
- apache commons学习系列记录之IO组件version2.4之一