A Peak Never Ending !

Shaperdを使ってポート単位で転送量を制限する

solrとか使っててIndexサイズが肥大化すると再生成して全台にレプリケーションとかする時に solrが全力で転送とかしちゃうものだから、ネットワークとかIOが涙目になる。そうじゃなくても ちょっとscpでログ転送とかしたいけど、サイズ大きいし、ゆるゆる転送したいな〜とか思う事がある。 そんなときにDebianだとshaperdってやつが使えるらしいので他のサーバにscpする時に転送量に制限をかける テストをしてみたメモ。アドレスで絞ったりもできるらしい。同じ要領でsolrマスターからスレーブに転送する時 に節度を保った転送が出来れば良い感じになるんじゃないだろうかという狙い(未確認)

準備

インストール。shaperdの他にiptablesでパケットをキューにつっこむ必要があるみたいなので、 そのためのモジュールも追加。

1
2
sudo modprobe ip_queue
sudo aptitude install shaperd

shaperd設定。configのサンプルは/usr/share/doc/shaperd/examples/にある

/etc/shaperd/shaperd.conf
1
2
3
4
5
6
7
8
9
10
11
12
log level = info
packet forwarding = ipq
daemon = yes
pidfile = /var/run/shaperd.pid

class all {
    ipv4 classifier proto=all
    bandwidth = 1.0 kbyte/s
    queue limits = 10 kb 10 packets
    ipv4 classifier prio=1 proto=tcp \
        out_if=eth0 dport=22
}

iptablesにもキューに入ってもらう設定がいるので入れないとダメなんだけど、

  • shaperd起動 -> iptables追加 -> iptables削除 -> shaperd停止

っていう手順を踏まないとパケットがキューに入ったまま出てこなくて涙目になるみたいなんで気をつける。 今回みたいに22番ポートが絡む設定とかで失敗するとssh出来なくなって悲しくなる。怖い人は80番とかで 試してみるといいと思う。

1
2
sudo /etc/init.d/shaperd start
sudo iptables -A OUTPUT -p tcp --dport 22 -j QUEUE

テスト

なんか大きいファイルをどこかに向けてscpする。1kb/s に絞る設定なのでちょっとしたファイルでも効果を 感じられると思う。うまくいかない場合は下みたいなコマンドでキューに入るルールにマッチしてるか確認すると良いと思う。

1
watch -n 1 -d 'iptables -n -L -v'