问题IP转发是在embedded式Linuxnetworking上丢弃Rx包

我有一个电脑和两个embedded式基于Linux的系统,我试图通过IP转发链接在一起。 他们跨越两个独立的本地networking。 两个networking都是有线的。 我可以从PC ping 10.10.10.6并从目标1 ping 10.10.30.1。当我运行目标1上生成一个健康(<3MBps)数量的UDP通信量的应用程序时,就会出现这个问题。 系统性能跟不上,我看到目标0的10.10.10.4接口上的RX丢包数连续增加。

两个目标都有很多的CPU周期。 所以问题是,为什么目标0丢弃这么多的数据包?

有什么我可以做的configuration,以通过提出? 增加缓冲区大小?

+-----------+ +--------------------------------------+ +-------------------+ | 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的input看起来被淹没时,两个目标之间的切换是否可以缓冲数据包,然后用大量数据突发目标0?

更新:

通过用旧的10M半双工集线器replace10/100/1000交换机,系统工作正常,没有丢包。

在坏的情况下,ethtool寄存器转储表示RX_DROP计数不断增加。 这表示处理器/ Linux无法从以太网芯片快速移除数据。 有了10M集线器,这不再是一个问题。

所以这对我来说听起来像是Linux没有正确configuration以保持更高(但不是那么高)的数据速率。 我想了解为什么OS /处理器不能跟上?

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

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

你可以做一个'IP链接列表| grep mtu'在两个目标?

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

您是否validation过所有链接都以全双工模式运行?

 dmesg | grep -i duplex 

应该在Linux上给你这个信息。 如果不成功,请尝试:

 mii-tool <interface> 

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

你正在发送的UDP数据包的大小分布是什么? 3MBps可能意味着每秒2000包或每秒50,000包,这取决于数据报的大小。

3MBytes /秒不应该是最现代的硬件困扰,这就是为什么我对所有链接的双工感兴趣。 半双工连接将导致冲突,并增加缓冲。

关于你的交换机能够缓冲帧的问题,这是可能的,但通常是不可调的。 您能够提供交换机上的制造/型号信息吗?