问题描述
- 在测试开发板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
中,使其开机自动执行。