基础信息
- 排查UDP数据丢包命令
- 网卡层丢包:netstat -i -udp eth1
- 查看RX-DRP项的值;
- 操作系统层丢包:cat /proc/net/snmp | grep -w Udp
- 查看InErrors数据项的值是否增加;
- 网卡层丢包:netstat -i -udp eth1
- 测试网络传输mtu值
- linux:ping -c 1 -M do -s 1400 www.baidu.com
- windows:ping -f -l 1500 www.baidu.com
- 查看网卡带宽
- linux:ethtool eth0
- UDP丢包改进建议:
- 组播发布端增加限流机制,发送数据流量尽量保证平滑;
- 增加丢包回补机制;
- 双路数据热备;
- 若要同时启用两路数据,需要保证两路数据组播包完全一致;
-
组播接收异常排查:
-
确认组播发送端 和 接收端,组播组的ip和端口是否一致; 确认配置的组播网卡地址是否正确;
-
检查防火墙;
-
组播接收服务器,抓包确认是否有收到udp数据包;
tcpdump udp port 9990
-
-
华为交换机上做测试,确认不同vlan之间可以传输组播数据;
-
但有一个限制,交换机上需要将各个vlan分为 组播vlan 和用户vlan,发送组播包的服务器必须在 组播vlan里面;即,组播数据只能由 组播vlan -》 用户vlan,不能由 用户vlan-》 组播vlan 或则 用户vlan -》 用户vlan;
-
-
组播测试工具:
-
局域网服务器间带宽性能测试:iperf
-
如果tcp带宽性能远好于udp带宽性能,可以确认下组播包大小是否远小于MTU值;
-
-
组播发送和接收小工具源码,见文档尾部;
-
硬件层
- 防止交换机将组播包 处理为广播包,需要开启交换机 igmp-snooping 配置;
- 注意:需要整个局域网内部所有的交换机都开启 igmp-snooping,因为组播通讯的发布方和订阅方可能经过中间任意一台交换机;
- 参考指令:
<SQ-ZHU-183.131.2.254>dis cu # igmp-snooping # vlan 370 description INSIDE igmp-snooping enable igmp-snooping drop-unknown igmp-snooping querier igmp-snooping general-query source-ip 10.20.0.1 igmp-snooping special-query source-ip 10.20.0
操作系统层
- kvm虚拟机,需要调整物理机组播参数:
-
开启igmp-snooping机制。若不开启,组播会被当作广播发往其上的所有虚拟机从而浪费带宽。
echo 1 > /sys/class/net/br0/bridge/multicast_snooping
echo 1 > /sys/class/net/br0/bridge/multicast_querier
-
注:默认情况下multicast_snooping为1,multicast_querier为0,这可能会产生组播发送一段时间后停止发送。
-
- 设置KVM虚拟机的网卡工作模式为virtio-net,并且启用vhost来提升虚拟网卡的性能。
查看网卡工作模式: #ethtool -i eth0 在宿主机中查看vhost使用情况: #grep VHOST /boot/config-3.5.0 #lsmod |grep vhost
- 增大虚拟网卡与虚拟网桥的发送队列长度,可以解决物理机到其上虚拟机之间的丢包情况。
示例: ifconfig br0 txqueuelen 10000 ifconfig vnet0 txqueuelen 10000
- 增大物理网卡驱动的缓冲区大小,可以解决物理网卡上丢包较多的问题。
示例: ethtool -G eth0 rx 4096
应用程序
-
增大socket缓冲区。通过setsockopt设置SO_RCVBUF选项来增大套接字缓冲区,若超过系统的上限则要修改net.core.rmem_max内核参数,来调整上限值。
- 示例:
- 调整系统缓冲区上限
sysctl -w net.core.rmem_max=1200000;
sysctl -p
应用程序设置套接字缓冲区
int nBuffSize = 1200000;
setsockopt(m_fd, SOL_SOCKET, SO_RCVBUF, &nBuffSize, sizeof(nBuffSize))
- 调整系统缓冲区上限
- 示例:
- 单个组播包大小,尽量接近MTU值;
- 常规网络环境MTU为 1500,部分云服务器厂商,设置的系统