Ethernetのボンディング Linuxのサーバーマシンにbond0インターフェースを作成

本日は、うちのネットワーク環境についての話題である。
サーバーマシンを少しでも速くして快適に開発ができるように、ネットワークカード2枚を使って、ボンディングしてみることにした。
サーバーマシンは、Linuxで稼働させているので、用語としては、ボンディングになる。Windowsの場合は、チーミングというらしい。
Windowsでのチーミング記事
Intelドライバでチーミング Windows10 Intel+Realtek リンクアグリ
で、難しい解説はしないが、ネットワークカードを複数使って、冗長構成にすれば、信頼性とパフォーマンスの両方を改善できる、というもの。現状、マザーにオンボードで付いているEthernetポート(100Mbps)は使っていない。PCIバスに増設した、ギガビットのEthernetだけを使っている。eth0とeth1があって、eth1だけを使っている。eth0も線をつなげて、有効活用しようではないか、というのが今回の趣旨である。
まずは、Linuxのカーネルに、bonding用のドライバを組み込む。ボンディングは、bond0といった仮想のEthernetデバイスを作成することで、運用可能になる。まずは、カーネルモジュールを組み込もう。モジュールの組み込みのために、bond.confを作成した。
/etc/modprobe.d/bond.conf

alias bond0 bonding
options bond0 mode=6 miimon=100 arp_interval=0

これで、デバイスbond0が使用可能になる。
mode=6というところがミソで、ここを変えると「単に予備回線があるだけ」のモードになる。両方のポートを使って、通信速度を改善させたいのなら、適切なモードを指定する必要がある。
miimonとarp_intervalは、よくわからないが、ポートの生死を確認するための方式の指定。MII監視によってポートの生死確認を行うようになっている。arp_intervalを0以外にすると、ARPのポーリングを使った監視方法になるらしい。ボンディングで検索してみると、設定例がいくつか出てくるが、MIIの方が多かったので、それらに倣って設定してみた。
次に、bond0に参加させるEthernetポートを定義していく。
/etc/sysconfig/network-scriptsに、ifcfg-eth0とifcfg-eth1があるので、これらの設定ファイルを変更する。
ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes

ifcfg-eth1

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes

eth1の方には、IPアドレスの指定が入っていたが、これは削除。MASTER=bond0として、SLAVE=yesを設定するのがミソ。
ifcfg-bond0を作成して、IPアドレスを設定。
ifcfg-bond0

DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
NETWORK=192.168.0.0
NETMASK=255.255.255.0
IPADDR=192.168.0.2
GATEWAY=192.168.0.1
DNS1=8.8.8.8
DNS2=192.168.0.1
BONDING_OPTS="miimon=100 mode=balance-alb arp_interval=0"

おなじみの設定内容となっているが、BONDING_OPTSのところがボンディングならではの設定。modprobe.confでモジュールをロードしたときと同様なオプション設定が必要。bondデバイスごとに設定できるようになっているわけね。
じゃあ、modprobe.confの設定は要らないかも?
この状態で、再起動すると、bond0が上がってくる。IPアドレスは、bond0に付けられた状態。ネットワークアクセスすると、両方のポートのLEDがチカチカするので、負荷分散もされている模様。
ここで、ちゃんとボンディングされているかを確認してみる。
まずは、eth1の方をダウンさせてみる。
ifdown eth1
片方のEthernetが死んでも、通信可能。冗長構成だからね。
この状態で、FTPで転送速度を計測してみると... 約11Mバイト/秒
eth0は100MbpsのEthernetだから、こんなものか。
eth1(ギガビットの方)を復活させてみる。
ifup eth1
同様に、FTPで転送速度を計測してみると... 約52Mバイト/秒
おー、速くなった。
じゃあ、eth0を落として、eth1だけだと... 約50Mバイト/秒
あれー、あんまり変わらないじゃない。若干(2Mバイト/秒)は落ちたかも。
クライアントの方もチーミングしているので、ギガビットEtherの限界っていうことはないと思うが...論理値は(125Mバイト/秒)だからねぇ... スイッチングHUBの性能も関係するのかも。
50M+11Mで、60Mくらいは出てもよいと思うのだが。
と思って、何回かやっていると、60Mバイト/秒近くのパフォーマンスを出した。でも、どうも、なんかやる度にバラ付きが。
なんか、ちゃんと負荷分散されているのかどうか"怪しい感じ"である。ギガビットふたつなら50M+50Mで100Mくらい出るかも?もしかして、同じHUBに突っ込んでも同じかも?
ちょっと冷静になって考えよう。ふたつのEthernetを使って、冗長構成にすれば、フエールセーフにはなる。どちらかが死んでも、どちらかが生きていれば、通信可能な状態になる。これは問題なくできている。
どちらも生きている場合は、負荷分散のために、パケットをふたつのポートに対して、ラウンドロビンで交互に送信する。
ということは、やはりHUBをわけないと帯域アップにはならないのか。送信側のPCでは分散されていても、受け側のスイッチが同じなら、そこでシリアライズされちゃうもんね。
100Mのスイッチが眠っていたので、これを付けてみたが、スイッチ間で情報を交換しないとだめなので、通信できなくなった。
どうも、リンクアグリゲーション(IEEE802.3ad)すると、倍の帯域で通信できるらしい。当然ながら、スイッチの方も802.3adに対応している必要がある。
Intel PRO Setで「スイッチのテスト」を実行すると、対応しているスイッチかどうかが、わかる。当然、そんなスイッチングHUBではないので、アグリゲーションはできない。
スイッチのテスト.png
ギガビットで802.3adに対応のスイッチ、8ポートで1万円くらいする。ちょっと保留かな。フェールセーフできた、ということで満足しておこう。
関連記事
 Windows10でチーミングできなくなった Intelドライバ22.3を導入
 ボンディング・チーミングのその後 NETGEARのインテリジェントL2-SW 802.3adに対応したL2-SWを購入した話。
802.3adに対応したギガビットスイッチ
NETGEAR GS108T

BUFFALO BSL-WS-G2108M

BUFFALO 法人向けレイヤー2WebスマートGigaスイッチHUB 8ポート BSL-WS-G2108M

BUFFALO 法人向けレイヤー2WebスマートGigaスイッチHUB 8ポート BSL-WS-G2108M

  • 出版社/メーカー: バッファロー
  • メディア: Personal Computers

オフィスといってもSOHOなので、VLANやら、802.1Xはいらないのよね。導入するのなら、NETGEARの方かな。
これらの他にCiscoやアライドのスイッチももちろんあるが、何十万もするので。中古なら安いかもしれないが... ラックに入れるようなサイズだしねぇ。
サーバーのクライアントがひとつなら、あまり変わらないかも知れない。サーバーの強化をするときに、スイッチも変えようと思う。
関連記事
ボンディング・チーミングのその後 NETGEARのインテリジェントL2-SW

投稿者プロフィール

asai
asai