Como obter um throughput total de 2 gigabits no Linux usando o driver de ligação?

5

Para este aplicativo, estou menos preocupado com a alta disponibilidade do que com o throughput total. Eu tenho um endereço IP no servidor, e eu quero ser capaz de enviar mais de 1 gigabit de tráfego para fora do servidor. O servidor tem duas placas de 1 gigabit e está conectado a um par de switches. O aplicativo envolve milhares de clientes remotos em todo o mundo conectados ao servidor (ou seja, não uma rede local).

Atualmente, a ligação é configurada usando o modo 5 (balance-tlb), mas o resultado é que a taxa de transferência de cada porta não ultrapassará 500 Mbit / s. Como posso ultrapassar esse limite? Por favor, assuma que eu não tenho acesso aos switches, então não posso implementar o 802.3ad.

(Eu estava esperando adicionar a tag "bonding", mas não posso adicionar novas tags, então é "teaming").

    
por Antoine Benkemoun 16.06.2009 / 18:54

4 respostas

6

É improvável que você atinja 2 gigabits sem cooperação no nível do switch e, mesmo assim, pode ser difícil com apenas uma combinação de origem / destino de IP. A maioria das equipes é configurada para hashing de IP, que aloca um único caminho de NIC para cada origem / destino. Como tal, você só receberá 1 gigabit. Existem esquemas de round-robin, mas muitas vezes você pode descobrir que a chegada de pacotes fora de ordem torna isso indesejável, a menos que o host e o destino suportem esse esquema.

    
por 16.06.2009 / 19:06
4

Você precisará de Agregação de portas nas portas do switch (as duas portas do switch de acesso que estão conectadas às portas de 2 gigabits da sua máquina precisam ser agregadas). Mas, uma vez que isso seja alcançado, você deve estar se aproximando de um caminho de 2 Gbps (limitado pelas capacidades da máquina).

Com a agregação de porta no switch correspondente à porta lógica de 2 Gbps do driver de ligação, você estaria usando um caminho redundante multiplexado com apenas um endereço IP na máquina.

Há algumas anotações interessantes que encontrei agora, aqui .

There is a dark side to this wonderful feature of the Linux bonding driver–it only works with network interfaces that allow the MAC address to be changed when the interface is open. The balance-alb mode depends on swift ARP trickery to fool the kernel into thinking the two physical interfaces are one by rewriting the MAC address on the fly. So the driver for the interface must support this, and many of them don't.

But that's not all the bonding driver can do. The mode option gives you seven choices, and you don't have to worry about interface compatibility. However you do need to consider what your switches support. The balance-rr, balance-xor and broadcast modes need switch ports grouped together. This goes by all sorts of different names, so look for "trunk grouping", "etherchannel", "port aggregation", or some such. 802.3ad requires 802.3ad support in the switch.

    
por 16.06.2009 / 19:23
3

Primeiro, você provavelmente sabe que nunca vai atingir 2Gb / s. A sobrecarga do TCP / IP limitará você a provavelmente 90% do máximo.

Em segundo lugar, mesmo se você usar um mecanismo de descarregamento de TCP, a pilha acima da camada 3 afetará definitivamente onde está o gargalo. Em outras palavras, como você está transmitindo os dados? Eu poderia ter 10Gb / s NICs e um cruzamento entre eles e eu não ficaria acima de algumas centenas de Mb / s se eu estivesse usando o rsync em um túnel ssh.

O que mais você pode nos dizer sobre a topologia? Você disse que o servidor está conectado a alguns switches e que os clientes remotos estão em todo o mundo. Você tem > 500Mb / s (agregado) de conexões WAN?

    
por 16.06.2009 / 19:23
1

Não resolvemos verdadeiramente este problema. O que fizemos foi configurar dois servidores, um vinculado a um IP em cada interface e seguir as instruções até aqui para forçar o tráfego a sair da porta em que ele veio:

link

Ligeiramente modificado para nossa situação. Neste exemplo, o gateway é 192.168.0.1 e os IPs do servidor são 192.168.0.211 e 192.168.0.212 em eth0 e eth1, respectivamente:

printf "1\tuplink0\n" >> /etc/iproute2/rt_tables
printf "2\tuplink1\n" >> /etc/iproute2/rt_tables

ip route add 192.168.0.211/32 dev eth0 src 192.168.0.211 table uplink0
ip route add default via 192.168.0.1 dev eth0 table uplink0
ip rule add from 192.168.0.211/32 table uplink0
ip rule add to 192.168.0.211/32 table uplink0

ip route add 192.168.0.212/32 dev eth1 src 192.168.0.212 table uplink1
ip route add default via 192.168.0.1 dev eth1 table uplink1
ip rule add from 192.168.0.212/32 table uplink1
ip rule add to 192.168.0.212/32 table uplink1
    
por 18.06.2009 / 18:27