Eu tenho um PC e dois sistemas baseados em linux embarcados que estou tentando encadear através do encaminhamento de IP.
Eles abrangem duas redes locais separadas. Ambas as redes estão conectadas. Eu posso pingar 10.10.10.6 do PC e pingar 10.10.30.1 do alvo 1.
O problema ocorre quando executo um aplicativo no destino 1 que gera uma quantidade saudável (< 3MBps) de tráfego UDP, direcionado para o PC.
O desempenho do sistema não pode acompanhar e vejo a contagem de pacotes perdidos do RX aumentar continuamente na interface 10.10.4.4 do alvo 0.
Existem muitos ciclos de CPU em ambos os alvos. Então a questão é: por que o alvo 0 está descartando tantos pacotes?
Existe algo que eu possa fazer com a configuração para finalizar? Aumentar os tamanhos de buffer?
+-----------+ +--------------------------------------+ +-------------------+
| PC |-->| target 0 |-->| target 1 |
|10.10.30.1 | | eth1 =10.10.30.2 eth0 =10.10.10.4 | | eth0 = 10.10.10.6 |
+-----------+ +--------------------------------------+ +-------------------+
o alvo 0 tem duas interfaces ethernet e ip_forwarding = 1
E eu tenho a configuração da rota a seguir:
no 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
e no alvo 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
e no alvo 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
Editar:
alvo 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
alvo 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
Ambas as conexões foram confirmadas para serem configuradas em 100Mbps Full duplex.
Outro pensamento:
Como parece, a entrada para o alvo 0 está sendo inundada, a troca entre os dois alvos, o buffer dos pacotes e, em seguida, o alvo 0 pode ser inundado com uma grande explosão de dados?
Atualização:
Ao substituir o switch 10/100/1000 por um hub half duplex antigo de 10M, o sistema está funcionando bem, sem pacotes descartados.
Na condição ruim, o despejo de registro de ethtool indicou que a contagem de RX_DROP aumentava continuamente. Isso indica que o processador / Linux não consegue remover os dados com rapidez suficiente do chip ethernet. Com o hub 10M, isso não é mais um problema.
Isso soa como se o Linux não estivesse configurado corretamente para manter a taxa de dados mais alta (mas não tão alta). Eu gostaria de entender por que o sistema operacional / processador não consegue acompanhar?