17 如何解决丢包问题

17.1 概述

本文分析丢包原因,给出解决丢包问题的方法。

17.2 如何确定是否丢包

运行示例程序 demo_online,观察每帧的点数是否正常。A0 雷达的每帧点数应该就是理论点数,是固定的。如果少了,则可能是丢包了。

要观察多雷达的情况,可以打开多个终端,分别运行多个 demo_online 的实例,看看每个雷达有没有丢包。

17.3 丢包原因

以下情况下可能丢包。

  • 在某些平台上,如 Windows 和嵌入式 Linux 平台

  • 多雷达的情况下

  • 系统 CPU 资源紧张时

17.4 解决办法

解决丢包的办法是将接收 MSOP Packet 的 Socket 的接收缓存增大。

ag_driver 工程的 CMakeLists.txt 中,宏 ENABLE_DOUBLE_RCVBUF 可以使能这个特性。

option(ENABLE_DOUBLE_RCVBUF       "Enable double size of RCVBUF" OFF)

代码如下。建议在实际场景下测试,再根据测试结果,将缓存大小调整为合适的值。

#ifdef ENABLE_DOUBLE_RCVBUF
  {
    uint32_t opt_val;
    socklen_t opt_len = sizeof(uint32_t);
    getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&opt_val, &opt_len);
    opt_val *= 2;
    setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char*)&opt_val, opt_len);
  }
#endif

在某些平台下,如 Ubuntu,系统设置了接收缓存的最大值。如果 ag_driver 设置的值超过了最大值,调用 setsockopt() 就不会成功。

这时需要手工放宽这个限制,如下面的指令,将这个最大值改为 851,968 个字节。

sudo bash -c "echo 851968 > /proc/sys/net/core/rmem_max"