当ページではスタイルシートを多用しているため旧式のブラウザでは一部表示結果が想定通りにならない事がございますが、内容をご確認頂く上で支障が無い様に配慮しております。予めご了承くださいませ。

Linuxで帯域制御を実現
tc + iproute2 によるLinuxでの帯域制御の技術メモ

poipoiServeでは、ごく一部の人気のコンテンツが、とてつもない高トラフィックを発生させていた。この影響でサーバとインターネットを結んでいるxDSL回線の限りある帯域(上り224Kbps)を圧迫し、メール転送やDNSによる名前解決、WEBMASTER各氏のtelnetによるリモートメンテナンスや、ftp、通常のWebページの運営など、Webサービスの全てにおいて支障が出ていた。

以前からこの人気コンテンツが使用する帯域を制限し、他のサービスの為に帯域を空けておく、若しくは、パケットの優先制御が行えないかを検討していた。パケットの優先制御を真の意味で実現するには、ボトルネックになっている回線のサーバ側だけでなく、インターネット側(つまりISP側)にも機構が必要になってくるため、今回はサーバから発信されるパケットで、人気コンテンツのパケットをコントロールする方法(帯域制御)を採った。

poipoiServeで利用しているTurboLunuxシリーズ(4.0以降で実現可能らしい)で、tc + iproute2 を使った帯域制御を実現できたので、今回はメモ書き程度にその手法を残しておくことにした。

尚、このメモを見るよりも、直接以下の参考にした文献をご覧になったほうが早いかもしれない。



基本的にはJFdocsに書いてあった通りにインストールを進めていっただけである。但し、インストールが少しでも楽なようにRPMを利用したかったため、Kondara LinuxのRPMパッケージを利用した点が少々違うわけだが・・・。

TurboLinuxのカーネルは、デフォルトでQoS support やCBQ packet schedulerなど、帯域制御に必要なコンパイルオプションが「モジュール」か「組み込み済み」になっているので、特に再コンパイルを行わなかった。

  • 無事にrpmパッケージを「rpm -ivh iproute-2.2.4-13k.i586.rpm」でインストール完了。
    → /sbinに「tc」「ip」が入っているかどうかを確認。
  • /etc/rc.dにcbq.initスクリプトをコピー。パーミッションを744に変更。(root権限時のみ実行可能)
  • /etc/sysconfigに「cbq」フォルダを作成。その中に「cbq-3030.http」ファイルを以下のように作成。
    poipoiServeのサーバに付いているNICは100Base-TXで、制限したいポートは3030、MAX帯域を150Kbps程度にしたかったので、以下のように定義した。

DEVICE=eth0,100Mbit,10Mbit
RATE=150Kbit
WEIGHT=15Kbit
PRIO=5
RULE=:3030,

  • ここで、一番最後のRULE=で制限したいポート番号を記述し、その後に「,」(カンマ)を記入する。←このことが(JF/JFdocs)に書いていなかったため帯域制限が効かず、解決の為に丸1日間かけて苦労してしまった。
  • /etc/rc.d/cbq.init startで実行する。

これで、ポート3030を使った通信で、サーバから送信されるパケットが150Kbps程度に制限できて、ApacheのバーチャルHOSTの設定も行い、現在(2001/02/19〜)安定的に運用できている。また、当初の目標通り、残りの帯域でメールサーバサービス・DNSなどの基本サービスを滞りなく運用することが出来た。

2001/08/01追記
5月以降,ADSL回線上のサーバではなく,サンシャイン60の別サーバでhttpdを稼動させているので,帯域制御そのものが必要無くなり,現在はポート3030に制限はかけていない。

ちなみに、複数のパケットに対して制限を掛ける場合には、/etc/sysconfig/cbqフォルダ内に複数の「cbq-(1).(2)」ファイルを作成し、/etc/rc.d/cbq.init restartなどを行えば良い。((1):ID番号、(2):解りやすい名前→何でも良いとする・・・詳しくは、cbq.initの中に書いてあるコメントを参照すると良い。正しい使い方が書いてある。英語だが解読することをお奨めする。)