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のように、最初は、送信側で、二つのポートを同時に使うと思っていました。色々、調べて行くうちに、動作は分かったのですが、テストの方法を思いつくのに、時間がかかりました。
送信側が、ポートを使い分ける確認は、もう少し台数の多い条件で、可能ならば試してみたいと思っています。