| Works
インバウンド通信の帯域を制限する
仕事でとある製品のパフォーマンス試験をすることになりましたので、その関連です。
条件の一つにネットワークのスループット低下が及ぼす影響というのがあるのですが、検証環境だと十分に負荷をかけることができないため"tc"コマンドで制限をしようということになりました。
しかし、"tc"はアウトバウンドの帯域制御は比較的容易なのですが、インバウンドにはちょっと工夫が要るようです。
そんな感じで、ネットの情報を頼りに試験で使いやすいように適当なスクリプトを作ってみました。
とりあえず条件としては制限の有効/無効を簡単にできること、引数で制限値と対象のインターフェースを変更できることです。
今回の試験用なのであまり使い回すことは考えていないですが、その気になったらしっかり作り直すかもしれません。
#!/bin/bash
SWITCH=$1 # "on" or "off"
DEVICE=$2 # "eth0", "br0", etc.
RATE=$3 # for example "1000m"
if [ "$SWITCH" = "on" -o "$SWITCH" = "off" ]; then
echo "--- Initialize $DEVICE and ifb0 ---"
tc qdisc del dev $DEVICE ingress handle ffff:
tc qdisc del dev ifb0 root handle 1: htb
sleep 3
rmmod ifb
else
echo "Usage: $0 <on|off> <interface> <rate>"
fi
if [ "$SWITCH" = "on" ]; then
echo "--- Load ifb module ---"
sleep 3
modprobe ifb
sleep 3
ip link set dev ifb0 up
echo "--- Mirror $DEVICE to ifb0 ---"
modprobe act_mirred
sleep 3
tc qdisc add dev $DEVICE ingress handle ffff:
tc filter add dev $DEVICE parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
echo "--- Traffic Shape ifb0 ---"
tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate ${RATE}bit
fi
exit
制限を有効にする場合は"./nwlimit.sh on eth0 1000m"のような感じで実行し、無効にする場合は"nwlimit.sh off"です。
仕組みとしては"ifb"デバイスを挟むことで実現しているのですが、"ifb"の本来の役割とかは実はよく分かっていません。(この辺を読んで勉強しています。)
というか、"tc"コマンドが複雑すぎてよく分かりません…。