Netty_UDP丢包解决
程序背景
程序是Java编写,基于Netty框架写的客户端及服务端。
现象
客户端大数据量持续发UDP数据,作为UDP服务器出现了部分数据频繁丢失触发程序自身重传逻辑。
通过GC日志对比发现丢包的时间点偶有处于Full GC,说明Java程序接收间歇性stop world的不是根因。
观察Udp的dump
通过watch -n 1 -d 'cat /proc/net/udp >> /usr/udpDump.txt'在发送数据的过程中持续观察Udp缓冲区的状况
- /proc/net/udp是瞬时的Udp socket dump,另有/proc/net/udp6用于监控IPv6
- dump输出里的tx_queue是发送缓冲区,rx_queue是接收缓冲区,单位都是byte
- 如果应用层收发效率足够好,正常情况下tx_queue和rx_queue两者永远是0
- 发送数据过程中频现rx_queue>0,说明Udp缓冲区有堆积现象
- 输出解释见How to monitor Linux UDP buffer available space?、Meaning of fields in /proc/net/udp
观察Udp的stats
通过watch -n 1 -d 'netstat -su >> /usr/udpStats.txt'持续观察Udp的stats输出
- 输出里packets received的值指应用层从读入缓冲区里取走的包
- 输出里packets to unknown port received的值指端口无应用监听而分发至该端口的包
- 输出里packet receive errors的值指Udp接收错误数,正常情况下应该是0,在观察中不停增加,证明出现Udp包溢出接收缓冲区的情况
- 发生错误的包数与接收错误数非一一对应
- 资料参见Udp Packet Receive Errors、Udp packet drops and packet receive error difference
解决问题
服务端代码优化
定论:
默认的UDP socket读缓冲区不够引发系统丢弃UDP包。
服务端代码优化设置UDP socket读缓冲区为2M,代码如下
Bootstrap selfBootStrap = new Bootstrap();
selfBootStrap.group(group);
selfBootStrap.channel(NioDatagramChannel.class);
selfBootStrap.option(ChannelOption.SO_BROADCAST, true);
// 这一行设置了UDP socket读缓冲区为2M
selfBootStrap.option(ChannelOption.SO_RCVBUF, 1024 * 2048);
selfBootStrap.handler(channelInitializer);
selfBootStrap.localAddress(selfPort);
理论上Udp socket读缓冲区设置为2M在我们的测试场景下已经足够。优化后虽有改善但仍有丢包现象。
Linux系统级调优
定论:
应用层设置了UDP socket缓冲区不一定在Linux上生效,原因在于Linux对Udp socket缓冲区存有系统级限制,超过该限制的缓冲区大小无效。
Windows对socket的缓冲区没有限制
要点分析:
Linux通过net.core.rmem_max控制Udp的读缓冲区,通过net.core.wmem_max控制Udp的写缓冲区。
在程序的启动sh脚本里添加如下代码修改net.core.rmem_max
# 服务器默认UDP读缓冲区最大128K。修改为2G。解决UDP丢包问题
rmemCount=`cat /etc/sysctl.conf|grep "net.core.rmem_max" | wc -l`
if [ ${rmemCount} -eq 0 ]
then
echo "net.core.rmem_max = 2147483647" >> /etc/sysctl.conf
sysctl -p
fi
脚本的作用就是修改/etc/sysctl.conf文件,并键入sysctl -p命令使自定义参数生效。
资料参见Improving UDP Performance by Configuring OS UDP Buffer Limits、UDP Drops on Linux
Netty_UDP丢包解决的更多相关文章
- winxp系统连接服务器丢包解决方法
winxp系统连接服务器丢包解决方法 MFC编写一个打开网页的程序,发生异常没有获取到数据. 分析步骤: 1. 用getLastError()获取到的信息,(2)- 系统找不到指定的文件. 2. 用浏 ...
- Android Studio多Module使用 aar 依赖包 丢包解决
FAQ: AAR打包引用丢包问题, jar, aar, dependency 嵌套层级依赖的丢失 问: aar包中,如何包含第三方依赖库? 如果直接作为module 依赖是没有问题的,但是如果打包成a ...
- 出现丢包解决方法(ping: sendmsg: Operation not permitted)
故障排查: 早上突然收到nagios服务器check_icmp的报警,报警显示一台网站服务器的内网网络有问题.因为那台服务器挂载了内网的NFS,因此内网的网络就采用nagios的check_icmp来 ...
- UDP丢包和无序 问题的解决方法
最近在做一个项目,在这之前,做了个验证程序. 发现客户端连续发来1000个1024字节的包,服务器端出现了丢包现象. 纠其原因,是服务端在还未完全处理掉数据,客户端已经数据发送完毕且关闭了. 我用过s ...
- Linux UDP严重丢包问题的解决
测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...
- AR8033 1000M模式下ping包丢包率过大分析与解决
1 现象 近期对一款基于QCA方案.有线Phy为AR8033.WiFi双频且支持iEEE802.11AC的WLAN产品进行了深度验证,发现有线口同部分PC机直连时,WiFi终端ping 该PC机时总是 ...
- VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时
之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...
- socket编程解决粘包和丢包问题
##socket 丢包粘包解决方式 采用固定头部长度(一般为4个字节),包头保存的是包体的长度 header+body 包头+包体 下面的例子不是按照上图中规定的格式编写的,但是思路都是一样的,先读出 ...
- 用ethtool 命令解决Linux 网卡丢包【转】
转自:https://blog.csdn.net/chengxuyuanyonghu/article/details/73739516 生产中有一台Linux设备并发比较大,droped包比较多,尤其 ...
随机推荐
- java多线程解读一(基础篇)
一.线程的定义 每个应用程序内部都是由一个或多个的进程组成,而每个进程内部都是由许多具体的线程执行,所以,线程是每个程序执行的最小单位. 二.线程的实现 1.通过继承java.lang.Thread类 ...
- [转载]windows 7 IIS 7.5 ASP.Net 文件上传大小限制
原文出处: 原文作者:云中岳 原文链接:http://www.cnblogs.com/netlover/archive/2011/07/08/Win7_IIS_Upload.html IS 7 默认文 ...
- [deviceone开发]-Star分享的几个示例
一.简介 这个是star早期分享的几个示例,都非常实用,包括弹出的菜单,模拟支付密码输入等.初学者推荐.也可以直接使用.二.效果图 三.相关下载 https://github.com/do-proje ...
- 学习笔记 HTTP参数污染注入
HTTP参数污染注入源于网站对于提交的相同的参数的不同处理方式导致. 例如: www.XX.com/a?key=ab&key=3 如果服务端返回输入key的值,可能会有 一: ab 二:3 三 ...
- UITabBarController 升级定制
UITabBarController 定制 特点 用法 1.准备工作: 加入你的相关图片,放入了Assets.xcassets; 导入Categroy文件夹(这个里面的文件,在这里不详细说明了,有疑问 ...
- Andriod 自定义控件之音频条
今天我们实现一个直接继承于View的全新控件.大家都知道音乐播放器吧,在点击一首歌进行播放时,通常会有一块区域用于显示音频条,我们今天就来学习下,播放器音频条的实现. 首先我们还是先定义一个类,直接继 ...
- 学习Maven之Maven Clean Plugin
1.maven-clean-plugin是个什么鬼? maven-clean-plugin这个插件用maven的人都不陌生.我们在执行命令mvn clean时调用的就是这个插件. 这个插件的主要作用就 ...
- Java实现压缩与解压缩
import java.io.*; import java.util.*; import java.util.zip.ZipOutputStream; import java.util.zip.Zip ...
- python学习笔记4-正则表达式
import re -- 所有正则表达式相关的功能都包含在re模块中 re.sub() -- 字符串替换 >>> import re >>> s= "10 ...
- 4-1 Linux用户管理命令详解
1. /etc/passwd 格式 用户名:密码:UID:GID:注释:家目录:默认shell useradd [options ] USERNAME -u: UID 要大于等于500, - ...