我正在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数据报的原因。
在Google上搜索时,我找到了如何使用netstat报告丢失数据包的示例,但这似乎不适用于此系统,因为没有“-s”选项。如何监控这些丢包?我该如何诊断病因?如何调整内核参数以最大限度地减少这种损失?
谢谢!
答案 0 :(得分:3)
Wireshark或tcpdump是一种很好的方法。 您可能需要查看/ proc / sys / net / ipv4 /中的设置,或者尝试使用较旧的内核(3.x而不是4.x)。我们在使用4.4内核的Zynq上遇到了tcp连接问题,但这可以在系统日志中看到(关于SYN cookie和可能的洪水的警告)。