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

8
我正在使用Zynq 7000板上的Xilinx Linux发行版。该板有两个ARM处理器、一些L2缓存、一个DRAM接口和大量的FPGA芯片。我们的设备收集由FPGA处理的数据,然后通过千兆网络发送到其他系统。
我们需要在这个设备上支持SNMP服务,这依赖于UDP数据报,虽然SNMP确实有TCP支持,但我们不能强制客户端使用它。
我发现这个系统几乎丢失了所有的SNMP请求。需要注意的是,网络和CPU都没有超载。数据速率并不特别高,CPU通常在30%左右的负载。此外,我们正在使用SNMP++和Agent++库进行SNMP,因此我们对其具有控制权,所以这不是系统守护程序中断的问题。但是,如果我们停止处理和网络活动,SNMP请求就不会丢失。SNMP在其自己的线程中处理,并且我们已经确保请求很少且分散,因此真正应该没有超过一个请求被缓冲。低CPU负载时,应该没有问题切换到接收进程来服务请求。
由于这不是CPU或以太网带宽问题,我的最佳猜测是问题出在Linux内核中。尽管网络负载较低,但我猜测有限的网络堆栈缓冲区被填满,这就是为什么会丢失UDP数据报的原因。
当我在谷歌上搜索时,我发现了如何使用netstat来报告丢失的数据包的示例,但这在该系统上似乎不起作用,因为没有“-s”选项。我该如何监视这些数据包丢失?我该如何诊断原因?我该如何调整内核参数以最小化此丢失?
谢谢!

有可能是在请求端丢失了SNMP响应,但那只是一台运行Linux操作系统的普通x86机器,拥有大量的CPU和内存。 - Timothy Miller
1
很好,我们可以对问题进行二分法,看看能否确定数据包到达哪里然后丢失了。您可以使用像Wireshark这样的工具来确保请求已经到达Zynq板。我建议使用tcpdump来查看内核中是否有可用的UDP数据包。您可以通过板子的闪存安装其他Linux工具。此外,UDP没有保证传递(我不确定SNMP是否在其上面有自己的重试逻辑)。 - Phil
好的,我个人从未使用过wireshark,但我的同事们有使用过,所以我会和他们一起处理。至于SNMP,它具有超时功能。在我的情况下,我正在尝试更改状态变量,但发现它没有被设置,因此我会生成一个线程进行10次重试。经常会丢失所有10次尝试,这令人沮丧。 - Timothy Miller
1个回答

3

Wireshark或tcpdump是一个好的方法。 您可能希望查看/proc/sys/net/ipv4/中的设置,或尝试使用旧版本内核(3.x而不是4.x)。我们在Zynq上使用4.4内核时遇到了与tcp连接相关的问题,但这可以在系统日志中看到(关于SYN cookies和可能洪水的警告)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接