O encaminhamento de IP do problema está descartando pacotes Rx na rede Linux embarcada

1

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?

    
por user27670 30.11.2009 / 22:05

2 respostas

1

Qual é o tamanho da MTU definido como target0 e target1?

Como este é L3 encaminhando um pacote maior que o MTU no Target0 precisaria ser fragmentado antes de ser passado para a interface eth1 do Target0, é possível que isso cause problemas (No entanto, não há provas de que isso levaria a pacotes RX descartados) .

Você pode fazer uma lista de links ip? grep mtu 'nos dois alvos?

Você ativou alguma filtragem de IPtables ou alguma coisa relacionada a política de IP / QoS?

    
por 04.12.2009 / 00:19
1

Você verificou que todos os links estão sendo executados em full duplex?

dmesg | grep -i duplex

Deve fornecer essas informações no Linux. Se isso não for bem sucedido, tente:

mii-tool <interface>

(Observe que o último precisa ser executado como root).

Qual é a distribuição de tamanho dos pacotes UDP que você está enviando? 3MBps podem significar 2.000 pacotes por segundo ou 50.000 pacotes por segundo, dependendo do tamanho dos seus datagramas.

3MBytes / second não deve atrapalhar o hardware mais moderno, motivo pelo qual estou interessado no duplex de todos os links. Uma conexão half duplex levaria a colisões, bem como um aumento no buffer.

Em relação à sua pergunta sobre o switch poder armazenar quadros, isso é possível, mas normalmente não é ajustável. Você é capaz de fornecer informações de marca / modelo nos comutadores?

    
por 04.12.2009 / 15:27