我正在维护一个 40G 网络设备的硬件测试套件,我们的许多测试包括从测试主机通过tcpreplay
DUT 发送手工制作的 UDP 数据包并返回到测试主机,我们在测试主机上捕获数据包tcpdump
并处理输出。
测试主机配备Intel XL710 NIC,运行带有i40e
驱动程序的Linux 5.4.0,设置如下所示:
************ ********** *******
| th0> ----- >sw0 sw1> ----- >dut0 |
| Testhost | | Switch | | DUT |
| th1< ----- <sw3 sw2< ----- <dut1 |
************ ********** *******
我们的问题是,在一次测试中,从 发送的最后几个(<10)个数据包th0
通常不会显示在tcpdump
的输出中,该输出在最后一个数据包发送后几秒钟内运行。我们通过观察交换机上的队列计数器th1
确保在这种情况下数据包在运行sw3
时已经离开,因此可以排除 DUT 故障。 没有列出被内核丢弃的数据包,丢失的数据包总是在下一次测试的后续调用中显示,这是意料之外的,但只有在通过链路发送了更多数据包之后才会显示。tcpdump
tcpdump
tcpdump
执行tcpdump
该--immediate-mode
标志没有帮助。丢失的数据包也不会显示在rx_packets
计数器输出中ethtool -S th1
。
我甚至不确定如何解释这一切,但我最好的猜测是这些数据包以某种方式被 NIC 或 Linux 网络堆栈缓冲,直到更多数据包到达才会被清除。我将不胜感激任何关于可能发生的事情的提示,我还可以做些什么来调试这个问题,或者如何解决这个问题。