Bonding : doubler votre bande passante
Par Fred le vendredi, novembre 19 2004, 18:47 - Linux - Lien permanent
Vous voulez savoir comment doubler votre bande passante sur un LAN en 4 lignes de commande ? Lisez ce qui suit !!!
Le support "Bonding" de Linux permet de "fusionner" deux interfaces Ethernet. Il est ainsi possible d’obtenir une interface virtuelle à 200 Mbps ou 300 Mbps en mariant les performances de deux ou trois interfaces Ethernet 100 BaseT. Le support du bonding peut être compilé dans le kernel ou sous la forme d'un module. Je vais expliquer dans cet article comment faire pour avoir 200 Mbps entre 2 PCs.
Installation
Pré requis :
- deux cartes réseaux
- deux câbles croisés
- le logiciel ifenslave (apt-get install ifenslave)
Pour vous repérer dans les logs, j'ai fait mes tests avec trois cartes réseaux sur chaque PC :
- une 100 Mbps 3Com (eth0 : 192.168.4.108), relié à mon routeur serveur DHCP pour Internet.
- une double 100 Mbps Intel pro (eth1 et eth2 : 192.168.0.10 et .5)
Explication :
Il faut commencer donc pas relier les deux cartes réseaux de chaque PCs avec deux câbles croisés.
Ensuite lancer le module bonding
modprobe bonding
Il est normalement disponible sous forme de module sur tous les noyaux récents. Sinon activez le dans "Devices Drivers -> Networking support -> Bonding driver support" et recompilez votre noyau.
Nous pouvons maintenant monter notre interface virtuelle bond0 :
ifconfig bond0 192.168.0.10 netmask 255.255.255.0
on peut specifier notre addresse MAC à la main sinon on peut celle de la première interface montée :
ifconfig bond0 hw ether 00:11:22:33:44:55
Et ensuite relier nos deux interfaces au bond0:
ifenslave bond0 eth1 ifenslave bond0 eth2
Vérification
Et voila en 4 lignes nous avons une double connexion. Regardons de plus près notre configuration (ifconfig) :
serveur13:~% ifconfig
bond0 Lien encap:Ethernet HWaddr 00:90:27:C6:7E:52
inet adr:192.168.0.10 Bcast:192.168.0.255 Masque:255.255.255.0
adr inet6: fe80::200:ff:fe00:0/64 Scope:Lien
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:1814210 errors:0 dropped:0 overruns:0 frame:0
TX packets:1804998 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:0
RX bytes:2048947128 (1.9 GiB) TX bytes:860980838 (821.0 MiB)
eth1 Lien encap:Ethernet HWaddr 00:90:27:C6:7E:52
inet adr:192.168.0.10 Bcast:192.168.0.255 Masque:255.255.255.0
adr inet6: fe80::290:27ff:fec6:7e52/64 Scope:Lien
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:907105 errors:0 dropped:0 overruns:0 frame:0
TX packets:902500 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:1024438913 (976.9 MiB) TX bytes:430469332 (410.5 MiB)
Interruption:11 Adresse de base:0x9000 Mémoire:f5200000-f5200038
eth2 Lien encap:Ethernet HWaddr 00:90:27:C6:7E:52
inet adr:192.168.0.10 Bcast:192.168.0.255 Masque:255.255.255.0
adr inet6: fe80::290:27ff:fec6:7e52/64 Scope:Lien
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:907105 errors:0 dropped:0 overruns:0 frame:0
TX packets:902498 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 lg file transmission:1000
RX bytes:1024508215 (977.0 MiB) TX bytes:430511506 (410.5 MiB)
Interruption:9 Adresse de base:0x9020 Mémoire:f5201000-f5201038
Vous pouvez remarquer que bond0, eth1 et eth2 ont tous la même adresse IP mais aussi la même MAC.
Pour vérifier notre bonding
vi /proc/net/bonding/bond0
qui donne :
Ethernet Channel Bonding Driver: v2.5.0 (December 1, 2003) Bonding Mode: load balancing (round-robin) MII Status: up MII Polling Interval (ms): 0 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth1 MII Status: up Link Failure Count: 0 Slave Interface: eth2 MII Status: up Link Failure Count: 0
Tests
Nous pouvons maintenant tester si nous avons bien doublé notre bande passante. J'utilise l'outil iperf pour ça. J'ai donc fait un test avec une simple connexion 100Mbits/sec puis un test avec les deux cartes en bonding.
Je fais le test en passant par la carte relié au routeur, lui-même relié à l'autre PC.
serveur13:~% iperf -c 192.168.4.185 -i 2 Client connecting to 192.168.4.185, TCP port 5001 TCP window size: 16.0 KByte (default) [ 3 local 192.168.4.108 port 32822 connected with 192.168.4.185 port 5001 [ ID Interval Transfer Bandwidth [ 3 0.0- 2.0 sec 22.1 MBytes 92.8 Mbits/sec [ 3 2.0- 4.0 sec 22.4 MBytes 93.9 Mbits/sec [ 3 4.0- 6.0 sec 22.4 MBytes 93.9 Mbits/sec [ 3 6.0- 8.0 sec 22.4 MBytes 93.9 Mbits/sec [ 3 8.0-10.0 sec 22.4 MBytes 93.8 Mbits/sec [ 3 0.0-10.0 sec 112 MBytes 93.6 Mbits/sec
Test sur le bonding.
serveur13:~% iperf -c 192.168.0.5 -i 2
Client connecting to 192.168.0.5, TCP port 5001 TCP window size: 16.0 KByte (default) [ 3 local 192.168.0.10 port 32811 connected with 192.168.0.5 port 5001 [ ID Interval Transfer Bandwidth [ 3 0.0- 2.0 sec 44.2 MBytes 185 Mbits/sec [ 3 2.0- 4.0 sec 44.8 MBytes 188 Mbits/sec [ 3 4.0- 6.0 sec 44.9 MBytes 188 Mbits/sec [ 3 6.0- 8.0 sec 44.8 MBytes 188 Mbits/sec [ 3 8.0-10.0 sec 44.8 MBytes 188 Mbits/sec [ 3 0.0-10.0 sec 224 MBytes 187 Mbits/sec
Alors, satisfait ?
Surveillance du lien réseau
Le driver bonding est capable de ne passer que sur une seule interface si un câble se débranche. Sachant que les pannes sur un serveur sont le plus souvent matérielles, cela permet une haute disponibilité. A noter deux petits outils permettant d'interroger les registres ETHTOOL et MII des cartes réseaux. Les outils sont donc mii-tool (issu du package net-tools) et ethtool. Toutes les interfaces ne supportent pas ces registres, dans ce cas on ne peut pas détecter la déconnexion (en fait il existe une solution en utilisant les requêtes ARP mais ça ne rentre pas dans ce cadre). Pour utiliser cette fonction du bonding il faut utiliser des modes tel que active-backup, pour plus d'info lisez la doc :).
Mii
serveur13:~% mii-tool eth0 eth0: negotiated 100baseTx-FD, link ok serveur13:~% mii-tool eth1 eth1: negotiated 100baseTx-FD flow-control, link ok serveur13:~% mii-diag eth0 Basic registers of MII PHY #24: 3000 786d 0000 0000 01e1 41e1 0005 2801. The autonegotiated capability is 01e0. The autonegotiated media type is 100baseTx-FD. Basic mode control register 0x3000: Auto-negotiation enabled. You have link beat, and everything is working OK. Your link partner advertised 41e1: 100baseTx-FD 100baseTx 10baseT-FD 10baseT. End of basic transceiver information.
serveur13:~% mii-diag eth1
Basic registers of MII PHY #1: 3000 782d 02a8 0150 05e1 45e1 0001 ffff.
The autonegotiated capability is 01e0.
The autonegotiated media type is 100baseTx-FD.
Basic mode control register 0x3000: Auto-negotiation enabled.
You have link beat, and everything is working OK.
Your link partner advertised 45e1: Flow-control 100baseTx-FD 100baseTx
10baseT-FD 10baseT, w/ 802.3X flow control.
End of basic transceiver information.
Ethtool
Avec la carte dual Interl pro :
serveur13:~% ethtool eth2
Settings for eth2:
Supported ports: TP MII
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pg
Wake-on: d
Link detected: yes
Avec la carte 3Com, ça ne fonctionne pas
serveur13:~% ethtool eth0 Settings for eth0: No data available
Conclusion
Vous avez vu qu'en quelques lignes, il est facile d'augmenter sa bande passante entre deux PCs reliés directement. A vous d'affiner cette configuration, je pense par exemple au fichier /etc/network/interfaces. Il est aussi possible de faire ce genre de chose en passant par un switch mais il faut qu'il supporte le trunking ou l'agrégation dynamique 802.3ad. Le channel bonding utilisé sous Linux est l'équivalent du Trunking de D-LINK ou encore de l'EtherChannel de CISCO. Tous ces systèmes ou équipements sont conformant à la norme IEEE 802.3ad.
Doc
- Documentation officielle : /usr/src/linux/Documentation/networking/bonding.txt
- Driver Channel Bonding sous Linux : http://www.sourceforge.com/projects/bonding
- Doc sur karlesnine.com