Bonding af Interfaces

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.

Dette indlæg blev udgivet i Knowledge Base, Linux, Networking, Old Base. Bogmærk permalinket.

Skriv et svar