在 Linux 上调试丢失的 UDP 消息

在 Linux 上调试丢失的 UDP 消息

这是我的设置:我有 1 台具有 1 Gbit 以太网连接的主机和 2 台具有 100 mbit 连接的主机(通过不同的交换机连接到 1Gbit 主机)。

在测试中,我从 1Gbit 主机向 100 mbit 主机发送了 1000 条 1kb 消息(在 sendto() 调用之间没有延迟)。对于其中一台 100 mbit 主机,没有数据包被丢弃。然而,另一台主机直到第 100 条左右才出现丢包,然后开始丢弃剩余的大多数数据包。非常可重复。当我引入 1ms 延迟时,两台主机都没有丢包。

我想知道为什么这两个主机之间会有不同的行为。

我应该使用哪些方法/工具来追踪此问题?我使用的是 Linux 6.8。并且我的 rmem_max 在两个主机上都设置为 10MB。

答案1

当您的网速不匹配且运行速度不匹配时,这是预期行为。如果您能够使 1GB 链路饱和,则在您发送 1000 个数据包时,另一端将只读取 100 个数据包。您的路由器不太可能缓冲剩余的 900 个数据包。

UDP 是一种不可靠的协议。与 TCP 不同,它没有内置的可靠传输功能。

对 TCP 连接进行类似的测试可能会有所帮助。双向运行该测试可能有助于确定问题是否是单向的。

运行time这些进程可能会让您知道其中一个进程是否比另一个进程运行得慢。 netstat -i在运行之前和之后,测试将允许您计算到达的数据量,并查看是否产生了任何错误。

ethtool可能会告诉您其中一台主机是否处于半双工模式。半双工连接容易出现您看到的问题。如果存在布线或其他问题,连接可能会在一个方向或两个方向上回落到 10 Mbit 半双工。

如果交换机是托管的,则应该检查相关端口上的配置和错误计数器。

如果两个系统有不同的以太网硬件,那可能就是问题所在。有些硬件无法处理饱和的链路。

相关内容