我正在用Python开发一个程序,该程序使用UDP从FPGA(数据收集器设备)接收数据。速度非常高,在最高设置下约为54 MB / s,这就是为什么我们使用专用的千兆以太网连接。我的问题是:很多包裹丢失了。这不是一时的问题,数据包进入很长时间,然后暂停了几秒钟,然后一切似乎都恢复了正常。暂停取决于速度(更快的通讯,更多的丢失)。
我尝试将缓冲区设置得更高,但是似乎缺少了一些东西。我设置了self.sock_data.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,2**28)
来增加缓冲区大小以及匹配的内核选项:sysctl -w net.core.rmem_max=268435456
。
包裹有一个内部计数器,所以我知道哪一个丢失了(另外,我用它来固定它们的顺序)。例如:大约357168个数据包丢失了11s数据。 (我已经检查过了,它不是程序或FPGA固件中内部缓冲区大小的倍数)。我正在单独的线程上查看套接字,然后立即将它们放入队列以保存所有内容。
我还应该设置或检查什么?