Bonding: multiplicando la velocidad del Ethernet

Software
Lo más común es el uso de las tarjetas Fast Ethernet (100 Mbps).  Una opción, entonces, es pasar a una tarjeta Gigabit Ethernet, aunque eso implica, por supuesto, que nuestro switch también lo soporte y ya hablamos de precios mayores.  Otra opción más económica es ponerle  dos (o más) tarjetas Fast Ethernet, sin embargo, esto no sirve si tenemos todas las tarjetas en la misma red, es decir, con IP's de la misma red, pues normalmente el sistema operativo (sea Window$ o Linux) escoge una tarjeta por defecto; no existe un balance de tráfico y casi la totalidad del mismo pasará por sólo una tarjeta.  Una posible mejora sería, entonces, que cada tarjeta este en una red distinta, pero esto no siempre está disponible además de complicarse innecesariamente la estructura de ruteo de la organización con resultados finales tampoco óptimos.

Es aquí cuando hace su aparición  la técnica de Bonding, ¿en qué consiste?, pues en hacer trabajar varias tarjetas de red como si fueran una sola, esto significa que incluso todas comparten la misma dirección MAC,  que se extrae de una de las tarjetas.  El resultado final es un aumento bastante considerable de la velocidad , y si usamos IP's públicos, pues basta solo uno.  En el caso de dos tarjetas de red, no puede decirse que la velocidad final crece en un 200%, pero fácilmente llegamos a un 180%.  He tenido la oportunidad de poder configurar este tipo de driver en Linux con resultados realmente sorprendentes, los tiempos de transmisión se reducen a valores cercanos a la mitad y la cantidad de datos transmitidos en cada tarjeta de red están perfectamente balanceados operando alternadamente. En particular he usado el Bonding en el modo 0, llamado Round-Robin, que permite balanceo de tráfico y redundancia (si falla una tarjeta de red el sistema sigue trabajando), pero existen hasta 6 modos distintos de operar el Bonding. Si vamos a usar el equipo con un switch es también necesario que los puertos implicados soporten el protocolo 802.3ad (Dynamic Link Aggregation) que en el caso de switches Cisco equivale a la configuración llamada EtherChannel, caso contrario, el switch puede tener fallas al recibir tramas con la misma dirección MAC origen en diversos puertos ocasionando que se bloqueen algunos de ellos.

Información más completa de cómo configurar el Bonding está entre los docs del kernel 2.4, sin embargo lo pueden ver en este link:

Les envio mi "micro-how-to" de como activarlo en una distro del tipo Red Hat con 2 tarjetas de red. Previamente el kernel debe haber sido compilado para trabajar con el driver de bonding, si no lo esta ejecutar "make menuconfig/xconfig/config" y seleccionar "Bonding driver support" (como módulo) en la sección "Network driver support". Adicionalmente debemos haber instalado correctamente todas las tarjetas de red (en este caso la eth0 y la eth1) para asegurarnos de su correcto funcionamiento. Una vez configurado el kernel, comprobado el funcionamiento de eth0 y eth1 y preparado el switch, pasamos a la configuración:

1. Añadir en /etc/modules.conf (para kernel 2.4) o /etc/modprobe.conf (para kernel 2.6) :

alias bond0 bonding
options bond0 miimon=100 mode=0

2. Crear el archivo ifcfg-bond0 en /etc/sysconfig/network-scripts, asumiendo que nuestro servidor tendrá el IP 192.168.0.1 y máscara 255.255.255.0 :

DEVICE=bond0
IPADDR=192.168.0.1
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

3. Modificar el archivo ifcfg-eth0 en /etc/sysconfig/network-scripts

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

4. Modificar ifcfg-eth1 en /etc/sysconfig/network-scripts

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

5. Reiniciar la red: "service network restart" o reiniciar la PC si prefieren.

6. Verificar el estado de las tarjetas de red con el comando ifconfig, debe aparecer algo similar a lo siguiente:

bond0 Link encap:Ethernet HWaddr 00:09:6B:89:28:28
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::209:6bff:fe89:2828/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:75698444 errors:0 dropped:0 overruns:0 frame:0
TX packets:71137605 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2329750937 (2.1 GiB) TX bytes:3737122066 (3.4 GiB)

eth0 Link encap:Ethernet HWaddr 00:09:6B:89:28:28
inet6 addr: fe80::209:6bff:fe89:2828/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:37802769 errors:0 dropped:0 overruns:0 frame:0
TX packets:35568803 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1118695876 (1.0 GiB) TX bytes:1868633917 (1.7 GiB)
Base address:0x2500 Memory:f8fe0000-f9000000

eth1 Link encap:Ethernet HWaddr 00:09:6B:89:28:28
inet6 addr: fe80::209:6bff:fe89:2828/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:37895675 errors:0 dropped:0 overruns:0 frame:0
TX packets:35568802 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1211055061 (1.1 GiB) TX bytes:1868488149 (1.7 GiB)
Base address:0x2540 Memory:f8fc0000-f8fe0000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:553353 errors:0 dropped:0 overruns:0 frame:0
TX packets:553353 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:525243973 (500.9 MiB) TX bytes:525243973 (500.9 MiB)


Observar como se define el dispositivo bond0 que agrupa a eth0 y eth1 en una sola MAC 00:09:6B:89:28:28, y como está balanceada la carga, con 1.7GBytes transmitidos en cada tarjeta y casi 1GByte recibidos en cada tarjeta también.