いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.160 / 読者数:1309名

こんばんは、うすだです。

昨日、ホタルを観に、岐阜県の七宗町というところへ行ってきました。

時期的にはちょっと遅くて、前に観に行ったときよりも数は少なかったのですが、 それでも、やさしい光が宙に浮く様は、幻想的で、とてもきれいでした。

また、息子が、偶然ホタルの幼虫を見つけまして、 もわんと光るところをじっくり観察できました。ホタルの幼虫を生で観るのは、 生まれて初めてでしたので、貴重な体験ができました。
写真で観ると、ちょっと「虫注意」な風貌をしているのですが、実物は、 小さくてもそもそと動く、かわいくて素敵なヤツでした。

自然は大事だ、ということを理解はしていても、実際に生で体験しているかどうかで、 その理解の度合いが全然違ってくるように思います。
知識だけでなく経験することの大切さを、今さらながらに再認識した次第です。 子どもにも、できるかぎり経験させてあげたいと思いました。

きれいにまとめたぞ!と思えたところで、今回もはりきってまいります。

今回のお題 - bonding で複数のNICをまとめて使う

わたしが大学の研究室に配属されて、初めて Sun のワークステーションに触れたころ、 ネットワークは、10BASE-5 というぶっとい同軸ケーブル (イエローケーブルとか言われていました)で接続されておりました。

PC(まだ PC98 が主流だったような…)の OS は DOS が主流であり、 PC用のネットワーク・インターフェース・カード(以降 NIC)は貴重でした。
せいぜい telnet や ftp が動作するくらいのものでしたが…。
(そもそも、OS が TCP/IP スタックを持っていませんでした。)

あれから15年くらい経った今(ひー)、ネットワークは、 PCでもすでにギガの世界へ突入しており、100BASE-T の NICであれば、 ありあまるほど存在しているように思います。
実際、パーツの墓場とも言えるところに、 使われなくなった NIC が何枚も置いてあったりしますよね。 (PC ごと放置されていたりもしますね。)

しかし、まだまだ動作するにもかかわらず、 すでにあるからといって放置して腐らせてしまうのは、 とてももったいない話です。
せっかく動くのですから、なにかで有効に活用したいものです。

というわけで、今回は、bonding というものを使って、 複数の NIC を束にしてまとめて使いたいと思います。

束にして使用するとスループットが上がりますので、負荷の高いLinuxに適用すれば、 お金をかけずにパワーアップさせることができます。
まさに、日本の「もったいない」精神に通じる技術ですね。(適当ー)


まず、bonding ですが、これは Linux カーネルのモジュールです。
複数の NIC を束ねて使用する、仮想的なネットワークドライバです。

ものすごく簡単にしくみを説明しますと、パケットを送信する際に、 複数の NIC を使用して送出します。
ですので、2つの NIC を束ねた場合、 理想的には2倍の速度で送信できることになります。 (送信完了を待たずに別のNICから送出できますので。)

さて、bonding にはいくつかモードがあり、どの NIC から送出するか、 モードによって異なります。各モードと簡単な説明を、以下に示します。

  • balance-rr
    ラウンドロビンで順番に送信します。デフォルトではこれを使います。
  • balance-xor
    送信元と送信先の MAC アドレスの最後の値を、 NIC の数で割った余りで NIC を決めます。 (あるマシン同士の通信は1つのNICを使います。)
  • broadcast
    すべての NIC から送信します。(ええっ!)
  • balance-tlb
    ネットワークの負荷によって分散します。
  • balance-alb
    これも負荷によって分散します。
    …が、balance-tlb との違いがよくわかりません。(す、すみません…)
  • 802.3ad
    IEEE802.3ad という規格に従って分散します。(詳細は…)
  • active-backup
    通常はアクティブな NIC だけを使用しますが、 アクティブな NIC から送信できない(リンクがない)場合に、別の NIC に切替えます。

…とまあ、実に7種類ものモードがあります。
とりあえず、以降では、デフォルトの balance-rr を使って、 NIC を束にして使ってみようと思います。

その前に、bonding を使用するために必要となるツールがあります。
それは、ifenslave というコマンドです。
RedHat 系の場合は iputils パッケージが、 Debian 系ですと ifenslave パッケージが必要です。 もしなかったらインストールしてください。


さしあたっては、手動での設定方法をご紹介しましょう。

最初に行うのは、bonding モジュールのロードです。
modprobe コマンドを使って、たとえば以下のようにロードしましょう。

  # modprobe bonding mode=balance-rr miimon=200

mode でモードを選択します。デフォルトで balance-rr が選択されますので、 指定しなくてもよいのですが、念のため指定しておきました。
また、miimon で、リンクをチェックする間隔をミリ秒で指定します。
(デフォルトでは 100ミリ秒です。)

すると、 bond0 という名前の仮想的なネットワーク・インターフェースが作成されます。 疑い深い貴兄は、ifconfig コマンドでご確認ください。

  # ifconfig bond0
  bond0     Link encap:Ethernet  HWaddr 00:00:00:00:00:00
            BROADCAST MASTER MULTICAST  MTU:1500  Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:0
            RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

そして、束にして使うネットワーク・インターフェースを止めます。
たとえば、eth0 と eth1 を停止するには、以下のように実行します。

  # ifconfig eth0 down
  # ifconfig eth1 down

次に、bond0 を有効にします。
たとえば、アドレスが 192.168.1.123, ネットマスクが 255.255.0.0 の場合、 以下のように実行します。

  # ifconfig bond0 192.168.1.123 netmask 255.255.0.0 up

そして最後に、eth0, eth1 を bond0 の家来として参加させます。
そのために、ifenslave コマンドを使用します。

  # ifenslave bond0 eth0 eth1

ネットワークが動作するか、ping コマンドで確認してみましょう。
(192.168.1.254 が実在しなければ、実在する相手を指定してください。)

  # ping 192.168.1.254
  PING 192.168.1.254 (192.168.1.254) 56(84) bytes of data.
  64 bytes from 192.168.1.254: icmp_seq=1 ttl=64 time=6.42 ms
  64 bytes from 192.168.1.254: icmp_seq=2 ttl=64 time=0.152 ms
  64 bytes from 192.168.1.254: icmp_seq=3 ttl=64 time=0.123 ms
  ...

念のため、ifconfig コマンドで確認してみましょう。

  # ifconfig bond0
  bond0     Link encap:Ethernet  HWaddr 00:01:02:03:04:05
            inet addr:192.168.1.123  Bcast:192.168.255.255  Mask:255.255.0.0
            UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
            RX packets:154456 errors:0 dropped:0 overruns:0 frame:0
            TX packets:126977 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:0
            RX bytes:150863990 (143.8 Mb)  TX bytes:20044525 (19.1 Mb)

  # ifconfig eth0
  eth0      Link encap:Ethernet  HWaddr 00:01:02:03:04:05
            UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
            RX packets:154325 errors:0 dropped:0 overruns:0 frame:0
            TX packets:126967 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:150822719 (143.8 Mb)  TX bytes:20043721 (19.1 Mb)

  # ifconfig eth1
  eth1      Link encap:Ethernet  HWaddr 00:01:02:03:04:05
            UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
            RX packets:143 errors:0 dropped:0 overruns:0 frame:0
            TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000
            RX bytes:45674 (44.6 Kb)  TX bytes:804 (804.0 b)

まず、bond0 が MASTER で、eth0 と eth1 が SLAVE になっています。
また、MACアドレスである HWaddr がいずれも同じ値になっています。
(ちなみに、上記の例では、架空の値に置き換えています。)
それから、eth0 と eth1 の送受信バイト数の合計が、 bond0 の値とほぼ一致することがわかります。 (上記では受信が微妙に一致しません。これは、 ifconfig コマンド実行の間に受信したからだと思われます。)

また、/proc/net/bonding/bond0 を参照して確認することも可能です。
こちらのほうが、bonding に関する詳細がわかると思います。

  # cat /proc/net/bonding/bond0
  Ethernet Channel Bonding Driver: v3.0.3 (March 23, 2006)

  Bonding Mode: load balancing (round-robin)
  MII Status: up
  MII Polling Interval (ms): 200
  Up Delay (ms): 0
  Down Delay (ms): 0

  Slave Interface: eth0
  MII Status: up
  Link Failure Count: 0
  Permanent HW addr: 01:23:45:67:89:ab

  Slave Interface: eth1
  MII Status: up
  Link Failure Count: 0
  Permanent HW addr: 00:11:22:33:44:55

さて、bonding を使用してネットワークが動作することは確認できましたが、 実際に速くなったのでしょうか。

これを確認するため、別のマシンから、 HTTP 経由でファイルを受信してみようと思います。
具体的には、別のマシンから 192.168.1.123 に対して、 wget コマンドでそれなりのサイズのファイルを得ます。
(192.168.1.123 側の apache 等の設定は、割愛させていただきます。)

  $ wget -O /dev/null http://192.168.1.123/100MB

これを、別のマシンが1台の場合と2台の場合とで、計測します。
2台の場合は、それぞれのマシンから、せーので同時に wget コマンドを実行します。

まずは、bonding を使用しない場合の速度をみてみましょう。

  [eth0]
  1台: 11.23MB/sec
  2台: 6.27MB/sec, 5.73MB/sec

2台の場合は、1台の場合の速度を分けあうような結果になっていますね。

では、bonding を使用した場合はどうでしょうか。

  [bond0 / balance-rr]
  1台: 11.18MB/sec
  2台: 9.92MB/sec, 8.79MB/sec

1台の場合は、bonding じゃない結果とほぼ同じですが、2台では、 1.5倍くらい速くなっているように思います。

他のモードでも、念のため確認してみました。

  [bond0 / balance-xor]
  1台: 11.20MB/sec
  2台: 9.55MB/sec, 8.55MB/sec

  [bond0 / balance-tlb]
  1台: 10.94MB/sec
  2台: 10.93MB/sec, 10.90MB/sec

balance-xor の場合、運が悪いと同じインターフェースを使用する可能性があり、 その場合は bonding ではない場合と同等の結果になってしまうと思います。 (上記の場合は、別のため、速くなっています。)

使用する PC や NIC の種類、使用するプロトコルや各種負荷など、 条件によって速度が変わってくると思います。
本気で導入されることを検討される場合は、 実際の使用状況に近い条件で計測してみてください。 (できれば微妙に条件を変えて何回も…。)


bonding を試しに設定して、速度が速くなったことが確認できました。
では、これを毎回手動で設定するのではなく、 起動時に自動的に設定してもらうようにしてみましょう。

 

まずは、RedHat 系の場合の設定例です。

  1. /etc/modprobe.conf に以下を追加します。
      alias bond0 bonding
      options bond0 mode=balance-rr miimon=200
    
  2. /etc/sysconfig/network-scripts/ifcfg-eth0 と ifcfg-eth1 を以下の内容のように変更します。
      DEVICE=eth0  (eth1 の場合は eth1)
      BOOTPROTO=none
      ONBOOT=yes
      MASTER=bond0
      SLAVE=yes
    
  3. /etc/sysconfig/network-scripts/ifcfg-bond0 を、以下のような内容で作成します。
    (IPADDR〜NETWORK の各値は、ご使用の環境にあわせてください。)
      DEVICE=bond0
      BOOTPROTO=static
      ONBOOT=yes
      IPADDR=192.168.1.123
      BROADCAST=192.168.255.255
      NETMASK=255.255.0.0
      NETWORK=192.168.0.0
    

あとは、再起動すれば bond0 が使えるようになる…はずです。
もしならなければ、/proc/net/bonding/bond0 の内容を確認するなどしてみてください。

 

次に、Debian 系の場合の設定例です。

  1. /etc/modules に bonding を追加します。
  2. /etc/modprobe.d/bonding を、以下のような内容で作成します。
      options bonding miimon=2000 mode=0
    
  3. /etc/network/interfaces を、以下のような内容に変更します。
    (各値は、ご使用の環境にあわせてください。)
      iface bond0 inet static
        address 192.168.1.123
        netmask 255.255.0.0
        network 192.168.0.0
        broadcast 192.168.255.255
        gateway 192.168.1.254
        dns-nameservers 192.168.1.254
        slaves eth0 eth1
    

こちらも、再起動すれば bond0 が使えるようになると思います。


以上、bonding で複数の NIC をまとめて使う方法をご紹介しました。

bonding は、たいていローダブルモジュールになっていると思いますが、 モードを変えて試したいときには、念のため再起動したほうがよいように思います。 (Debian などで挙動がおかしくなりました。)

また、ifcfg-bond0 に HWADDR の項目があると、立上りにものすごく時間がかかる上、 bondig が正しく設定されませんでした。
既存の ifcfg-eth0 などをコピーして作成する際には、ご注意ください。

宿題の答え

前回の宿題は、

  Monit で、同じ条件で複数の処理を行わせてみましょう。

でした。

答えを言ってしまいますと、if 文を複数書けばよいです。

たとえば、ディレクトリ /etc/apache2/conf.d のタイムスタンプが変化したときに、 "/etc/init.d/apache2 graceful" を実行しつつ、 通常とは別のアドレス(たとえば apache_admin@usupi.org)に メールで通知したいとしましょう。
そんなときは、以下のような設定を追加します。

  check directory httpd.conf.dir with path /etc/apache2/conf.d
    if changed timestamp then exec "/etc/init.d/apache2 graceful"
    if changed timestamp then alert
    alert apache_admin@usupi.org

おおもとに set alert の設定があれば、 set alert で指定したアドレスにもメールが飛んでいきます。

今回の宿題

今回の宿題は、

  bonding により受信速度が向上するかどうか、確かめてみましょう。

です。

複数の NIC を使って送信しますので、送信が速くなるというのはわかりますが、 では、受信の場合はどうなのでしょうか。

まず推測してから計測されることを、おすすめします。

あとがき

本来なら前回取り上げるべきだったのですが、 なんやかんやで購入が遅くなってしまいまして、前回は書けませんでした。

はい、それは、「UNIXマガジン」のことです。
6月18日発売の2009年7月号を最後に、NETWORKマガジンと合併することになり、 UNIXマガジン自体はなくなってしまいます。

UNIX magazine
http://ascii.asciimw.jp/books/magazines/unix.shtml

思えば、大学4年に研究室へ配属され、UNIXを毎日使うことになってからずっと、 UNIXマガジンは、バイブル的な存在でした。

他にも、UNIX USER や C マガジン、Software Design などは、 当時からありましたが、内容の濃さと実用性のバランスがもっともすぐれていたのは、 「ゆにまが」だったように思います。

とはいえ、今の会社に入ってからは、ほとんど読んでいませんので、 8年近く読んでいなかったのですが…。

というわけで、最終号を買って読んでみました。
なんと言いますか、「ゆにまが」らしさがなくなり、 他の技術雑誌とほぼ変わらないような印象を受けました。
ですが、「UNIXの未来」に書かれているクラウドに関する話は、 ちょっと目から鱗的で、興味深かったです。

時代の流れとともに、必要な情報や形態などは日々変わっていきます。
ですので、古いものが淘汰されてしまうのは、仕方ないかもしれません。
ノスタルジーにひたりつつも、前を向いて歩いていかなければならない、 と思いました。(またしても適当ー)

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、7月19日(日) 未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」 - 岐阜県の某所で栗の何かができるかもしれません。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本