Linux で発信帯域を制限する

SERVER


Linux での帯域制御

Linux では tc (traffic control) というソフトウェアを利用して、帯域制限 (発信制限) を施すことが可能なようです。

この tc はどうやら iproute パッケージの一部のようで、CentOS 5.5 では標準で tc が利用できる状態になっているようでした。そしてこの tc を利用することで、Linux カーネルの帯域制御を設定することができる様子です。

これを利用することで、発信制限の他にも、通信遅延やパケットのロストなど、さまざまな通信帯域を作り出すことができるようなのですけど、まずは発信帯域制限だけに着目して、設定方法を調べてみたいと思います。

なお、この tc は、カーネルと協調して動作するようですので、利用にはカーネル構築時に CONFIG_NET_SCHED が有効化されている必要があるようです。

 

tc で発信帯域を制限する

以下は試してみた感じでの話になりますけれど、tc で帯域制御を行う場合、qdisc に対してデバイスと、制御に使用する方式みたいなものを指定して、設定して行く感じの様でした。

制御に使用する方式みたいなものとしては、"cbq" や "htb" や "tbf" 等といったものが指定でき、それらに依った帯域制御を設定することになるようです。

 

今回は "htb" を利用して、eth0 の通信帯域を 3Mbit/s に制限してみたいと思います。

そのために、まずは eth0 に対して qdisc を設定します。

tc qdisc add eth0 root handle 1: htb default 0

これで、文の表現が正しいかどうかは別として、eth0 のルート qdisc として、htb が使用されるように設定されるようでした。

このとき、この登録した qdisc のハンドル番号には、メジャー番号として 1 が設定されています。また、適用される既定の htb のマイナー番号として 0 を指定したことになるようでした。

 

続いて、適用される htb のルールを登録します。

tc class add dev eth0 parent 1:0 classid 1:0 htb rate 3Mbit

このようにすることで、eth0 に関連付けられている parent で指定した "ハンドル番号:0" の qdisc に対して、通信制限 3Mbit/s が設定され、それのクラス ID は "1:0" となるようです。

クラス ID は、コロンを挟んで左側はメジャー番号で、これは qdisc のハンドル番号と一致させる必要があるような感じです。そして右側は、このclass 設定に対して割り当てるマイナー番号です。最初の qdisc の設定で htb の既定のマイナー番号を 0 にしてありますので、特に何も指定しなければ、上記で登録したルールが適用されることになる感じでした。

また、転送レートの設定で使用する単位ですが、1Mbps や 100Mbps といった、ネットワーク設定で一般的な "bit/s" 単位で指定したい場合には、qdisc では "Mbit" や "Kbit", "Gbit" といった単位で指定することになるようです。"Mbps" や "Kbps" といった単位もありますが、こちらは "Byte/s" 単位で扱われてしまうので注意が必要です。

 

実際に、この状態で大容量のファイルをこの Linux からダウンロードしてみたところ、しっかりと帯域制限が効いている感じがありました。

通信途中で制限を変更することも出来ました。

tc class replace dev eth0 parent 1:0 classid 1:0 htb rate 1Mbit

設定の時と違うのは "add" が "replace" に変わるくらいで、これを実行することで、即座に新たに指定した制限値が有効になってくれました。

 

 

他にも filter という機能を利用して、発信元がどこからだとか、発信ポートが何番だとか、そういった条件に応じて適用する htb ルールを切り替えることもできるような感じだったのですけど、今回はそこまで必要なかったので、調査は省略してあります。

また、"htb" 以外のその他の制御方法についても、例えば "tbf" なら "tc-tbf" というような形で man を調べれば、それの設定の仕方を調べることができるようになっていましたので、必要に応じてそのような形で知識を広げて行くと良いでしょう。

 

なお、qdisc の設定状態や、class の設定状態は、次のようにすることで確認できるようになっていました。

tc -s qdisc show

tc -s class show dev eth0

こうすることで、eth0 に設定されている "qdisc" や "class" の情報を確認することができます。

qdisk の情報では、"rate" で現在の発信制限がいくつに帯域制限されているかの他にも、"dropped" でバッファー不足によって落としたパケット数を、"overlimits" で tc による帯域制限を超えて落としたパケット数を確認できるようにもなっているようでしたので、運用時にはこれらの情報も、必要に応じて確認して行くと良いと思われます。

 

ちなみに "class" や "qdisc" を削除したい場合には、次のような感じにするようです。

tc class del dev seth0 classid 1:0

tc qdisc del dev seth0 root

このような感じで、該当するものを削除することが出来ました。

試してみた感じでは "qdisc" を削除すると、それに付随する "class" についても削除される感じでした。

 

このような感じで、発信帯域制限をかけて行く感じになるようです。

もちろん、上記の設定をコンソールから直接実行しただけでは、Linux 再起動時に制限が解けてしまいますので、"/etc/rc.d/init.d" や "/etc/rc.d/rc.local" から、Linux 起動時に設定が読み込まれるようにしておく必要があると思います。