我有一台 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/秒不应该对大多数现代硬件造成麻烦,这就是我对所有链路的双工感兴趣的原因。半双工连接会导致冲突,并增加缓冲。
关于您提到的交换机是否能够缓冲帧的问题,这是可能的,但通常不可调整。您能提供交换机的品牌/型号信息吗?