Som en del af en opgave fra en kunde skal jeg sætte en Cisco Switch og nogle servere op med hver 4x1GBit netkort, dvs. vi skal til at bonde interfaces på både Cisco’en og Debian maskinen, og da det gik op for mig at jeg ikke har skrevet særlig mange indlæg om netværk så syntes jeg det var passende at lave et blogindlæg om det.
Mit første skridt var at køre en baseline test mellem tre maskiner via ét interface, bare for at have styr på hvor meget/lidt vi kan smide igennem, jeg installerede iperf på begge maskiner:
# apt-get install iperf
Og satte en af maskinerne op som server:
root@a:~# ifconfig intl0 10.0.0.2 up
root@a:~# iperf -s -B 10.0.0.2
Og fyrede en test af ved samtidig at udføre flg. kommando på begge maskiner: (hvis du skal bruge talene til at dokumentere noget for nogen er du selvfølgelig nødt til at automatisere den del)
root@b:~# iperf -t 60 -i 5 -c 10.0.0.2
root@c:~# iperf -t 60 -i 5 -c 10.0.0.2
Resultatet, aflæst på serveren:
[ 4] local 10.0.1.1 port 5001 connected with 10.0.1.3 port 52463
[ 5] local 10.0.1.1 port 5001 connected with 10.0.1.2 port 38061
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 3.40 GBytes 486 Mbits/sec
[ 5] 0.0-60.0 sec 3.21 GBytes 460 Mbits/sec
Afslører et samlet throughput på 946Mbit/sec hvilket er ganske udemærket for et 1000Mbit/sec netkort, det vi opnår med bonding er at switchen sender hver forbindelse gennem hver sit netkort.
Nu vil jeg prøve at sætte et bond op på min server:
# apt-get install ifenslave-2.6
Derefter flg. opsætning i /etc/network/interfaces:
auto bond0
iface bond0 inet static
address 10.0.1.1
netmask 255.255.255.0
slaves intl0 intl1
mtu 1500
bond_xmit_hash_policy layer2+3
bond_lacp_rate slow
bond-mode 802.3ad
bond-miimon 100
bond-downdelay 200
bond-updelay 200
Derefter skal din switch opsættes til at tillade 802.3ad / Link Aggregation Control Protocol (LACP), på min kundes Cisco Switch gøres det således:
Switch#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch#interface range GigabitEthernet 0/37, gigabitEthernet 0/38
Switch#channel-group 1 mode active
Switch(config-if-range)#end
Så up’er jeg interfacet på serveren: (alle interfaces der indgår i bondet skal være down inden du up’er bondet)
root@a# ifup bond0
Og hvis du tjekker på switchen nu (evt. skal du vente på at switch-portene kommer op, alt. afh. din opsætning) kan du se at linket er oppe:
Switch#show interfaces port-channel 1 | include line protocol
Port-channel1 is up, line protocol is up (connected)
Igen starter jeg iperf på serveren og lader den lytte på bondet’s ip:
root@a# iperf -s -B 10.0.1.1
------------------------------------------------------------
Server listening on TCP port 5001
Binding to local address 10.0.1.1
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
og på to af maskinerne starter jeg, igen samtidig, en klient. Hvilket efter et lille minutstid afslører at begge mine klienter uden problemer henter med i snit 941Mbit/sec hver.
[ 4] local 10.0.1.1 port 5001 connected with 10.0.1.2 port 46741
[ 5] local 10.0.1.1 port 5001 connected with 10.0.1.3 port 52468
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec
[ 5] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec
Altså alt i alt 1882Mbit/s … lad os se hvad der sker hvis vi gentager eksperimentet fra 3 maskiner:
[ 4] local 10.0.1.1 port 5001 connected with 10.0.1.4 port 53140
[ 5] local 10.0.1.1 port 5001 connected with 10.0.1.2 port 46742
[ 6] local 10.0.1.1 port 5001 connected with 10.0.1.3 port 52469
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 3.44 GBytes 493 Mbits/sec
[ 5] 0.0-60.0 sec 3.16 GBytes 453 Mbits/sec
[ 6] 0.0-60.0 sec 6.57 GBytes 940 Mbits/sec
Igen lander vi på omkring 1800Mbit/s, og vi kan se at to af vores forbindelser har fået lov at dele det ene netkort mens den tredie har fået frit spil, det viser os, som forventet, at vi ikke kan “dele” en forbindelse op over flere netkort, men vi kan fordele forbindelserne mellem de forskellige netkort.
LACP med 4 Porte
Vi har fået besked på at bonde alle 4 porte i serverne, så det gør vi her:
I /etc/network/interfaces tilføjer jeg de sidste netkort:
slaves intl0 intl1 intl2 intl3
og kører:
# ifdown bond0 && ifup bond0
og på switchen:
Switch#conf t
Switch(config)#interface range GigabitEthernet 0/31, GigabitEthernet 0/32, GigabitEthernet 0/33, GigabitEthernet 0/34
Switch(config-if-range)#channel-group 2 mode active
Switch(config-if-range)#end
Desværre har jeg kun 3 testmaskiner til rådighed, med testen herfra giver også et ret konsistent mønster:
root@a:~# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 10.0.1.1 port 5001 connected with 10.0.1.2 port 35807
[ 5] local 10.0.1.1 port 5001 connected with 10.0.1.10 port 38533
[ 6] local 10.0.1.1 port 5001 connected with 10.0.1.3 port 52477
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec
[ 5] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec
[ 6] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec
Jeg tør næsten væde med at når vi får en 4. maskine på og teste med så får vi 941Mbit/sec mere igennem 😉
Håber du kan bruge det her til noget.