Zynq 7000上的嵌入式Linux,几乎丢弃了所有UDP数据包

Embedded Linux on Zynq 7000, dropping almost all UDP packets

我正在Zynq 7000板上使用Linux的Xilinx发行版。它具有两个ARM处理器,一些L2缓存,一个DRAM接口和大量的FPGA结构。我们的设备收集F??PGA处理的数据,然后通过千兆网络将其发送到其他系统。

我们需要在此设备上支持的一项服务是SNMP,它依赖于UDP数据报,尽管SNMP确实具有TCP支持,但是我们不能强迫客户端使用它。

我发现该系统几乎丢失了所有SNMP请求。

请务必注意,网络和CPU均未过载。数据速率不是特别高,CPU通常负载在30%左右。另外,我们将SNMP和代理库用于SNMP,因此我们可以控制它们,因此系统守护进程的中断不是问题。但是,如果我们确实停止处理和网络活动,则SNMP请求不会丢失。 SNMP是在其自己的线程中处理的,我们确保将请求保留为稀有和分散状态,以便在任何时候实际上最多只能缓冲一个请求。在低CPU负载的情况下,上下文切换到接收进程以处理请求应该没有问题。

由于这不是CPU或以太网带宽问题,所以我最好的猜测是问题出在Linux内核上。尽管网络负载较低,但我猜想有限的网络堆栈缓冲区会被过度填充,这就是为什么它丢弃UDP数据报的原因。

在对此进行谷歌搜索时,我找到了一些示例,该示例说明如何使用netstat报告丢失的数据包,但是在该系统上似乎不起作用,因为没有" -s"选项。如何监控这些丢包?我如何诊断原因?如何调整内核参数以最大程度地减少这种损失?

谢谢!


Wireshark或tcpdump是一个很好的方法。
您可能需要查看/ proc / sys / net / ipv4 /中的设置,或者尝试使用较旧的内核(3.x而不是4.x)。我们在使用4.4内核的Zynq上的tcp连接方面遇到问题,但这可以在系统日志中看到(有关SYN cookie和可能的洪泛的警告)。