帯域制御

(2001年6月29日更新)

Vine Linux 2.1.5では帯域制御のためにはカーネル再構築が必要でした。まず始めにカーネル再構築を行ないました。

掲示板で助言して頂いたSHIROさんのLinuxで帯域制御を実現traffic control Mini-Howtoを参考にしました。検索してもこれ以外の日本語の文書は見つけることができませんでした。文書がないところを見ると帯域制御の需要はないのかな。個人でフレッツISDNやOCNエコノミーでサーバ運営している人は帯域制御の必要性を少なからず感じると思うのですが...。

まず、ftp://ftp.infoscience.co.jp/pub/linux/ip-routing/iproute2-current.tar.gzまたはftp://ftp.inr.ac.ru/ip-routing/iproute2-current.tar.gzからiproute2-current.tar.gzをDownloadし、これを/tmpにコピーし、下記のようにコンパイル、そしてできたバイナリipとtcを/sbinにコピーしました。


cd /tmp
tar xzvf iproute2-current.tar.gz
cd iproute2
make
cp ip/ip /sbin/ip
cp tc/tc /sbin/tc

ftp://ftp.equinox.gu.net/pub/linux/cbq/cbq.initからcbq.initをDownloadしました。これを/etc/rc.d/init.d/にcbqという名前でコピーしました。またコピーしたcbqは実行可能属性を与え、ntsysvでこれが起動時に実行されるようにしました。traffic control Mini-HowtoではSlackwareの場合なので/etc/rc.d/へコピーすると書いてありますが、Vine Linuxならば/etc/rc.d/init.d/に拡張子なしでコピーするのが妥当だと判断しました。

さて、最後に/etc/sysconfig/cbq/というディレクトリを作り、ここに下記の内容のcbq-10.httpというファイルを作りました。64KbitのISDNの例はなかったので、cbq.initのコメントを読みながら自分なりに考えました。これでwww.maid.orgから出力されるhttpに限って10Kbitに制限されるはずです。ポイントはRULEの行の最後のカンマ「,」でしょう。SHIROさんの文書がなかったら、私なんぞは丸1日悩むどころでは済まなかったことしょう。SHIROさんに感謝。


DEVICE=tap0,64Kbit,6Kbit
RATE=10Kbit
WEIGHT=1Kbit
PRIO=5
RULE=:80,

しかしながら、これで本当にうまくできたのかわからないので、試しに下記のような内容のファイルを/etc/sysconfig/cbq/以下に作り、ローカル間でwgetをしてみました。結果、激遅になったので、たぶん外向けの帯域制御も成功しているはずです。


DEVICE=eth0,100Mbit,10Mbit
RATE=10Kbit
WEIGHT=1Kbit
PRIO=5
RULE=:80,

その後ある方からメールを頂き、私の認識が間違っていたようです。ISDNの64Kbpsというのは上下合計の値で、仮に上りで56Kbps使われている時には下りでは8Kbpsしか使えないと思っていました。しかし本当は上りで56Kbps使われていても、それとは別で下りは64Kbps使えるようです。それならば、上りの半分以上をhttpに費やしても良さそうです。試しに下記のようにしてみました。


DEVICE=tap0,64Kbit,6Kbit
RATE=30Kbit
WEIGHT=3Kbit
PRIO=8
RULE=:80,

ブラウザから設定する方法(2001年6月29日)

1日のうち私がWebの閲覧などをしている時間は僅かですし、その場合でもほとんどは帯域制限は必要ないです。ですから、必要なときだけ制限をするようにしたいと思います。帯域制限のon/offを簡単に切替える方法としてWebから設定ができるようにしようと考えました。

要はCGIで先のスクリプトを呼べばできると考え「/etc/rc.d/init.d/cbq start」呼ぶcbq.plを書いてみました。(もちろん、これにアクセスできるのはローカルなマシンからだけです。)


#!/usr/bin/perl

print 'content-type:text/html;charset=iso-8859-1';
print "\n";
print '<html>';
print '<body>';
print '<p>';
if ($ENV{'QUERY_STRING'} eq 'start') {
	print `/etc/rc.d/init.d/cbq start`;
} elsif ($ENV{'QUERY_STRING'} eq 'stop') {
	print `/etc/rc.d/init.d/cbq stop`;
} else {
	print `/etc/rc.d/init.d/cbq stats`;
}
print '</p>';
print '</body>';
print '</html>';

「/etc/rc.d/init.d/cbq stats」だけは成功し、Webから設定を見ることができるのですが、その他は失敗します。cbq.plのユーザ、グループをrootにして属性をchmod 6755として実行時にユーザーIDとグループIDが設定されるようにしました。しかしそれでも駄目でした。うーん...。


戻る