Linux 802.3adとLACP の動作確認テスト

LinuxのBoundで、Mode=4(802.3ad)を設定してテストした結果です。

SWは、Catalyst 3750を使用しました。
Linuxは、CentOS 5.5 (64bit)です。

テストの環境としては、以下のようなイメージで、3台のサーバをCat3750のLACP EtherChannelで設定しています。

Catalyst 3750の設定確認

設定を入れるやり方は、Catalyst 3750 スイッチでのスタック間 EtherChannel の設定例 - Cisco Systemsなどを参考にしてください。

設定を確認します。

3750 >show interfaces Port-channel ?
  <1-48>  Port-channel interface number

3750>show interfaces Port-channel 1
Load for five secs: 6%/0%; one minute: 7%; five minutes: 7%
Time source is NTP, xx:xx:xx.xxx JST xxx xxx xx 2010

Port-channel1 is up, line protocol is up (connected) 
  Hardware is EtherChannel, address is xxxx.xxxx.xxxx (bia xxxx.xxxx.xxxx)
  Description: # To  x-1#
  MTU 1500 bytes, BW 2000000 Kbit, DLY 10 usec, 
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  Full-duplex, 1000Mb/s, link type is auto, media type is unknown
  input flow-control is off, output flow-control is unsupported 
  Members in this channel: Gi1/0/1 Gi2/0/1 
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input never, output 00:00:00, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 10
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     9924229 packets input, 701865748 bytes, 0 no buffer
     Received 78501 broadcasts (78500 multicasts)
     0 runts, 0 giants, 0 throttles
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 watchdog, 78500 multicast, 0 pause input
     0 input packets with dribble condition detected
     20416428 packets output, 29624797606 bytes, 0 underruns
     0 output errors, 0 collisions, 0 interface resets
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier, 0 PAUSE output
     0 output buffer failures, 0 output buffers swapped out

3750 >show etherchannel summary
Load for five secs: 6%/0%; one minute: 7%; five minutes: 7%
Time source is NTP, xx:xx:xx.xxx JST xxx xxx xx 2010

Flags:  D - down        P - bundled in port-channel
        I - stand-alone s - suspended
        H - Hot-standby (LACP only)
        R - Layer3      S - Layer2
        U - in use      f - failed to allocate aggregator

        M - not in use, minimum links not met
        u - unsuitable for bundling
        w - waiting to be aggregated
        d - default port


Number of channel-groups in use: 20
Number of aggregators:           20

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)         LACP      Gi1/0/1(P)  Gi2/0/1(P)  
2      Po2(SU)         LACP      Gi1/0/2(P)  Gi2/0/2(P)  
3      Po3(SU)         LACP      Gi1/0/3(P)  Gi2/0/3(P)  
4      Po4(SU)         LACP      Gi1/0/4(P)  Gi2/0/4(P)  
5      Po5(SD)         LACP      Gi1/0/5(w)  Gi2/0/5(D)  
6      Po6(SU)         LACP      Gi1/0/6(P)  Gi2/0/6(P)  
7      Po7(SU)         LACP      Gi1/0/7(P)  Gi2/0/7(P)  
8      Po8(SU)         LACP      Gi1/0/8(P)  Gi2/0/8(P)  
9      Po9(SU)         LACP      Gi1/0/9(P)  Gi2/0/9(P)  
10     Po10(SU)        LACP      Gi1/0/10(P) Gi2/0/10(P) 
11     Po11(SU)        LACP      Gi1/0/11(P) Gi2/0/11(P) 
12     Po12(SU)        LACP      Gi1/0/12(P) Gi2/0/12(P) 
13     Po13(SU)        LACP      Gi1/0/13(P) Gi2/0/13(P) 
14     Po14(SU)        LACP      Gi1/0/14(P) Gi2/0/14(P) 
15     Po15(SU)        LACP      Gi1/0/15(P) Gi2/0/15(P) 
16     Po16(SU)        LACP      Gi1/0/16(P) Gi2/0/16(P) 
17     Po17(SU)        LACP      Gi1/0/17(P) Gi2/0/17(P) 
18     Po18(SU)        LACP      Gi1/0/18(P) Gi2/0/18(P) 
19     Po19(SU)        LACP      Gi1/0/19(P) Gi2/0/19(P) 
20     Po20(SU)        LACP      Gi1/0/20(P) Gi2/0/20(P) 

channelと、LACPの設定は、行われている事が確認出来ます。

サーバ側の確認

Bondingの設定などに関しては、bondingなどを参照してください。

設定確認をします。

以下は、1台のサーバのみの確認結果ですが、全てのサーバで行います。

[root@2 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.4.0 (October 7, 2008)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: slow
Active Aggregator Info:
	Aggregator ID: 1
	Number of ports: 2
	Actor Key: 9
	Partner Key: 2
	Partner Mac Address: xx:xx:xx:xx:xx:xx

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Aggregator ID: 1

Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Aggregator ID: 1
[root@2 ~]# ifconfig
bond0     Link encap:Ethernet  HWaddr F0:4D:A2:07:9C:4C  
          inet addr:10.29.154.2  Bcast:10.29.154.255  Mask:255.255.255.0
          inet6 addr: fe80::f24d:a2ff:fe07:9c4c/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:31025374 errors:0 dropped:55 overruns:0 frame:0
          TX packets:15575692 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:46911236109 (43.6 GiB)  TX bytes:1096532128 (1.0 GiB)

-- cut

eth1      Link encap:Ethernet  HWaddr F0:4D:A2:07:9C:4C  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:17128727 errors:0 dropped:55 overruns:0 frame:0
          TX packets:8598270 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:25906859480 (24.1 GiB)  TX bytes:605037268 (577.0 MiB)
          Interrupt:98 Memory:d8000000-d8012800 

eth2      Link encap:Ethernet  HWaddr F0:4D:A2:07:9C:4C  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:13896647 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6977422 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:21004376629 (19.5 GiB)  TX bytes:491494860 (468.7 MiB)
          Interrupt:106 Memory:da000000-da012800 

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:1287281 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1287281 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:17736598690 (16.5 GiB)  TX bytes:17736598690 (16.5 GiB)

bondingと802.3ad(LACP)の設定は、行われている事が確認出来ます。

テストの考え方

802.3adの場合、1つのホストとは、1つのポートで送信を行います。また、送信元サーバがどのポート(eth1,eth2)を使うかは、送信先のMacAddress(HWaddr)を元に、XORを取った値で決定されます。そのため、送信元で、複数のポートを同時、または、交互に使う事を確認するのは、難しいと思われます。

このあたりの説明は、

http://osdn.jp/event/kernel2005/pdf/nec.pdf

Linux_技術文書_bondingドライバの違いについて | 日本ヒューレット・パッカード

が、分かり易いと思います。

そこで、以下のように、2つのサーバから一つのサーバに対しての送信テスト行いました。LACPが動作していれば、受信がわのサーバは、2つのポートで受信を行う為、送信側の伝送速度には、影響がでないはずです。もし、2台で、うまく行かなかったとしても、この方法ならば、送信側を増やせばよいので、試験はやりやすいと思います。


テスト方法

netperfを、三台のサーバにインストールを行い、1台のnetserverに対して、残りの2台からほぼ同時間帯、計測をおこないます。

テスト実行記録

受信側の準備と、bond0,eth1,eth2のパケットの計測を行います。

[root@2 ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
bond0      1500   0        8      0      0      0        6      0      0      0 BMmRU
eth0       1500   0 20971802      0      0      0  5977676      0      0      0 BMRU
eth1       1500   0        4      0      0      0        3      0      0      0 BMsRU
eth2       1500   0        4      0      0      0        3      0      0      0 BMsRU
lo        16436   0  1287285      0      0      0  1287285      0      0      0 LRU

[root@2 ~]# netserver 
Starting netserver at port 12865
Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC

送信側から、同一時間帯に、1分間(-l 60)、計測します。

root@3 ~]# netperf -H 10.29.154.2 -l 60 -t TCP_STREAM -- -m 65535
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.29.154.2 (10.29.154.2) port 0 AF_INET
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380  16384  65535    60.03     941.36   

[root@4 ~]# netperf -H 10.29.154.2 -l 60 -t TCP_STREAM -- -m 65535
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.29.154.2 (10.29.154.2) port 0 AF_INET
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380  16384  65535    60.03     941.12   

受信側のbond0,eth1,eth2のパケットの計測を行います。

[root@2 ~]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
bond0      1500   0  9762269      0      0      0  4885954      0      0      0 BMmRU
eth0       1500   0 20978524      0      0      0  5977790      0      0      0 BMRU
eth1       1500   0  4880534      0      0      0  2443328      0      0      0 BMsRU
eth2       1500   0  4881735      0      0      0  2442626      0      0      0 BMsRU
lo        16436   0  1287285      0      0      0  1287285      0      0      0 LRU

結果

2台のサーバから送信を行いました。送信側の伝送速度は、2台とも、約940Mbsでています。また、受信側のサーバのポートのパケット受信状態は、2つのポート(eth1,eth2)で受信を行ってる事が確認できました。

以上の結果から、802.3adとLACPは、正常に動作しています。

感想など

結構、誤解をしていて、悩みました。
Balance-rrのように、最初は、送信側で、二つのポートを同時に使うと思っていました。色々、調べて行くうちに、動作は分かったのですが、テストの方法を思いつくのに、時間がかかりました。

送信側が、ポートを使い分ける確認は、もう少し台数の多い条件で、可能ならば試してみたいと思っています。