我正在使用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服务,这依赖于UDP数据报,虽然SNMP确实有TCP支持,但我们不能强制客户端使用它。
我发现这个系统几乎丢失了所有的SNMP请求。需要注意的是,网络和CPU都没有超载。数据速率并不特别高,CPU通常在30%左右的负载。此外,我们正在使用SNMP++和Agent++库进行SNMP,因此我们对其具有控制权,所以这不是系统守护程序中断的问题。但是,如果我们停止处理和网络活动,SNMP请求就不会丢失。SNMP在其自己的线程中处理,并且我们已经确保请求很少且分散,因此真正应该没有超过一个请求被缓冲。低CPU负载时,应该没有问题切换到接收进程来服务请求。
由于这不是CPU或以太网带宽问题,我的最佳猜测是问题出在Linux内核中。尽管网络负载较低,但我猜测有限的网络堆栈缓冲区被填满,这就是为什么会丢失UDP数据报的原因。
当我在谷歌上搜索时,我发现了如何使用netstat来报告丢失的数据包的示例,但这在该系统上似乎不起作用,因为没有“-s”选项。我该如何监视这些数据包丢失?我该如何诊断原因?我该如何调整内核参数以最小化此丢失?
谢谢!
tcpdump
来查看内核中是否有可用的UDP数据包。您可以通过板子的闪存安装其他Linux工具。此外,UDP没有保证传递(我不确定SNMP是否在其上面有自己的重试逻辑)。 - Phil