我在Zynq 7000板上使用Xilinx Linux发行版.它有两个ARM处理器,一些L2缓存,一个DRAM接口和大量的FPGA架构.我们的设备收集FPGA处理的数据,然后通过千兆网络将其发送到其他系统.
我们需要在此设备上支持的服务之一是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和可能的洪水的警告).
您可能需要查看/ proc / sys / net / ipv4 /中的设置,或者尝试使用较旧的内核(3.x而不是4.x).我们在使用4.4内核的Zynq上遇到了tcp连接问题,但这可以在系统日志中看到(关于SYN cookie和可能的洪水的警告).