问题 IP 转发在嵌入式 Linux 网络上丢弃 Rx 数据包

问题 IP 转发在嵌入式 Linux 网络上丢弃 Rx 数据包

我有一台 PC 和两个嵌入式 Linux 系统,我正尝试通过 IP 转发将它们连接在一起。它们跨越两个独立的本地网络。两个网络都是有线的。我可以从 PC ping 10.10.10.6,从目标 1 ping 10.10.30.1。当我在目标 1 上运行应用程序时,问题就出现了,该应用程序生成了大量(< 3MBps)的 UDP 流量,并指向 PC。系统的性能跟不上,我看到目标 0 的 10.10.10.4 接口上的 RX 丢弃数据包数不断增加。

两个目标上都有足够的 CPU 周期。那么问题是,为什么目标 0 会丢弃这么多数据包?

我可以对配置进行哪些操作来提高吞吐量?增加缓冲区大小?

+-----------+   +--------------------------------------+   +-------------------+ 
|  PC       |-->|              target 0                |-->|  target 1         |
|10.10.30.1 |   | eth1 =10.10.30.2   eth0 =10.10.10.4  |   | eth0 = 10.10.10.6 |
+-----------+   +--------------------------------------+   +-------------------+

目标 0 有两个以太网接口,并且 ip_forwarding = 1

我在 PC 上设置了以下路线:

Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
       10.10.10.6  255.255.255.255       10.10.30.2      10.10.30.1       1
       10.10.30.0    255.255.255.0       10.10.30.1      10.10.30.1       20

在目标 0 上:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.30.0      *               255.255.255.0   U     0      0        0 eth1
10.10.10.0      *               255.255.255.0   U     0      0        0 eth0
default         10.10.10.6      0.0.0.0         UG    0      0        0 eth0
default         10.10.30.1      0.0.0.0         UG    0      0        0 eth1

对于目标 1:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.30.1      10.10.10.4      255.255.255.255 UGH   0      0        0 eth0
10.10.10.0      *               255.255.255.0   U     0      0        0 eth0
default         10.10.10.4      0.0.0.0         UG    0      0        0 eth0

编辑:目标 0

# ip link list | grep mtu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

目标 1

# ip link list | grep mtu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

已确认两个连接均设置为 100Mbps 全双工。

另一个想法:

由于看起来目标 0 的输入正在被淹没,那么两个目标之间的交换机是否可以缓冲数据包,然后用大量数据淹没目标 0?

更新:

通过用旧的 10M 半双工集线器替换 10/100/1000 交换机,系统运行良好,没有丢失数据包。

在不良情况下,ethtool 寄存器转储显示 RX_DROP 计数持续增加。这表明处理器/Linux 无法足够快地从以太网芯片中删除数据。使用 10M 集线器,这不再是问题。

所以在我看来,Linux 没有正确配置以保持更高的(但不是那么高)数据速率。我想知道为什么操作系统/处理器无法跟上?

答案1

target0 和 target1 上的 MTU 大小设置是多少?

由于这是 L3 转发,因此大于 Target0 上的 MTU 的数据包在传递到 Target0 eth1 接口之前需要进行分段,这可能会导致问题(但是没有证据表明这会导致 RX 数据包丢失)。

您可以在两个目标上执行“ip link list | grep mtu”吗?

您是否启用了任何 IPtables 过滤或任何与 IP 策略/QoS 相关的内容?

答案2

您是否已验证所有链路均以全双工运行?

dmesg | grep -i duplex

应该会在 Linux 上为您提供此信息。如果失败,请尝试:

mii-tool <interface>

(请注意,后者需要以 root 身份运行。)

您发送的 UDP 数据包的大小分布如何?3MBps 可能意味着每秒 2,000 个数据包或每秒 50,000 个数据包,具体取决于数据报的大小。

3MBytes/秒不应该对大多数现代硬件造成麻烦,这就是我对所有链路的双工感兴趣的原因。半双工连接会导致冲突,并增加缓冲。

关于您提到的交换机是否能够缓冲帧的问题,这是可能的,但通常不可调整。您能提供交换机的品牌/型号信息吗?

相关内容