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