iperf3测试udp大量丢包
网络出现丢包一般优化思路如下
1 numa节点开或关 2 修改网卡ring buffer 3 配置网卡多队列 4 设置网卡中断亲和 5 flow control 6 硬中断合并 7 内核tcp/ip参数优化 8 cpu性能调整
9 网卡驱动
10 应用程序
1:iperf3测试udp大量丢包
1 iperf3 -c ip -i 1 -t 300 -u -b 300m 2 3 表示udp 客户端,每次报告之间的时间间隔1s,udp测试,时间300s,带宽300M,
1 iperf3 -s 2 表示服务端在等待接收
iperf3具体测试命令参考https://www.cnblogs.com/zongfanstudy/articles/16656131.html
通过多次交叉测试、两台机器直连、通过交换机路由器连接等多种情况,发现udp丢包率在20%左右。
1.1客户端查看发送是否丢包
$cat /proc/net/snmp|grep Udp
Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
Udp: 911 0 0 601 0 0 0 6
UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
UdpLite: 0 0 0 0 0 0 0 0
查看结果第二行的Udp后面的第3个数(InErrors)5个数(RcvbufErrors),这里都为381445,
说明接收端出现错误,且都是缓冲区错误,需要将rmem_default/rmem_max继续改大,如果两个值不一样,可能还有其他原因丢包,继续排查ifconfig和netstat -s
1.2服务端查看接收是否丢包
$cat /proc/net/snmp|grep Udp Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti Udp: 42336 1 232345 246 383415 0 0 716 UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti UdpLite: 0 0 0 0 0 0 0 0 查看结果第二行的Udp后面的第3个数(InErrors)5个数(RcvbufErrors),这里都为381445, 说明接收端出现错误,且都是缓冲区错误,需要将rmem_default/rmem_max继续改大,如果两个值不一样,可能还有其他原因丢包,继续排查ifconfig和netstat -s
1.3 确定是客户端还是服务端问题后,
ifconfig查看丢包是errors/dropped/overrun哪一种, $ifconfig 网卡名 enp0s3: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether e8:6a:64:48:af:2e txqueuelen 1000 (以太网) RX packets 13103668 bytes 12865579207 (12.8 GB) RX errors 0 dropped 109 overruns 0 frame 0 (服务端查看这一行) TX packets 6462181 bytes 5217815587 (5.2 GB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 (客户端查看这一行) device interrupt 16 memory 0xdc200000-dc220000 如果errors不为0且比较大,可以通过ethtool -S 网卡名|grep error 查看哪一种errors比较大,针对修改之; 如果dropped不为0且比较大,继续排查协议层;netstat -sw 查看Ip字段和Udp字段; 如果overrun不为0且比较大,说明网卡的tx/rx 队列过小,需要改大:
1.4 如果做了bond,建议把两块bond网卡的txqueuelen改大为8192
$ ifconfig 网卡名 txqueuelen 8192 可以通过ip a|grep qlen 确认是否修改成功
1.5 查看CPU负载情况
(在iperf3测试中查看),看是否有某个cpu上的负载特别高的情况,确认是 %usr %nice %sys %iowait %irq %soft %steal %guest %gnice中的哪一个比较高?确定是否需要进程或中断绑核
$ mpstat -P ALL
Linux 5.4.0-124-generic (szf) 2022年09月04日 _x86_64_ (6 CPU)
21时50分36秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
21时50分36秒 all 0.06 0.00 0.10 0.24 0.00 0.02 0.00 0.00 0.00 99.58
21时50分36秒 0 0.05 0.01 0.09 0.24 0.00 0.04 0.00 0.00 0.00 99.58
21时50分36秒 1 0.05 0.00 0.10 0.17 0.00 0.01 0.00 0.00 0.00 99.67
21时50分36秒 2 0.06 0.00 0.12 0.23 0.00 0.02 0.00 0.00 0.00 99.58
21时50分36秒 3 0.06 0.00 0.11 0.41 0.00 0.01 0.00 0.00 0.00 99.41
21时50分36秒 4 0.07 0.01 0.11 0.20 0.00 0.01 0.00 0.00 0.00 99.61
21时50分36秒 5 0.06 0.01 0.08 0.17 0.00 0.05 0.00 0.00 0.00 99.64
2 解决办法
通过一系列的测试,解决方法为修改内核参数.修改后udp不再丢包
修改前 sysctl net.core.rmem_default=213442 sysctl net.core.rmem_max=2062152 sysctl net.ipv4.udp_mem="756207 1024438 1536424"
修改后 sysctl net.core.rmem_default=21344200 sysctl net.core.rmem_max=206215200 sysctl net.ipv4.udp_mem="75620700 102443800 153642400"
具体内核参数参考https://www.cnblogs.com/zongfanstudy/articles/16656297.html
注:优化后的参数会大量占用内存,如果内存不够建议增大物理内存

浙公网安备 33010602011771号