ubuntu下udp丢包

问题描述

  • 在测试开发板rk3588的千兆网口时,出现了丢包情况。
  • 具体是从内网中连续接收数据,发送端速率在650Mbps左右。
  • 接收端丢包率15%左右。

问题原因

  • ubuntu对于应用程序能申请的udp接收缓存大小存在限制。如下命令可以查看当前的Ubuntu接收缓存限制大小。
    cat /proc/sys/net/core/rmem_max

  • 获取结果如下:

jie@ubuntu:~$ cat /proc/sys/net/core/rmem_max
212992
  • 可知接收缓存大小为212KB左右,对于650Mbps的发送速率,非常小。
  • 使用如下命令将接收缓存限制调整到60M
    sysctl -w net.core.rmem_max=60000000 # 设置为 60M
  • 同时修改最大缓存报文数量,将系统允许的最大缓存设置为6000个,如下所示:
    sudo sysctl -w net.core.netdev_max_backlog=6000
  • 最后修改网络的mtu值为1280,这里将mtu调为1280,因为我的程序固定一包长1062,所以调小mtu可以加速处理流程,我的接收网口是eth0,所以命令如下:
    ifconfig eth0 mtu 1280 up

修改程序代码

  • 上一节的第一条仅修改了系统缓存上限设置,我们的程序也要同事修改缓存大小,我这里使用的c++编程,在设置接收sock的数据时,设置缓存大小为48M,如下所示:
cosnt char* valueTemp = new char[48 * 1024 * 1024]; // 48M
//设置接收缓冲区
setsockopt(sockfd,S0L SOCKET, S0 RCVBUF, (const char*)&valueTemp, sizeof(valueTemp));
  • 注意,这里应用的接收缓存要在上节设置的系统缓存上限限制内,如上节设置是60M,这里48M就没有问题!

问题解决

  • 再次测试,以650Mbps发送,接收端实现了0丢包。

修改cpu频率

  • udp的速率瓶颈也和cpu处理存在一定关系,为了进一步稳定速率和丢包率,这里对cpu频率进行修改。
    cpufreg-set-r-f 2.26GHz
  • 使用如上命令讲cpu频率固定在2.26GHz。
  • 可将上述命令添加进/etc/rc.local中,使其开机自动执行。
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值