tc コマンドをつかって帯域制限をかけたつもりだったのですが、シンプルな設定だと片方向(上り)しか帯域制限がかかっていませんでした。そこで調べたところ "下りに対する帯域制御は不可能" という検索結果もあったのですが、もう少ししらべたところ、ifbにリダイレクトすることで下りに対する帯域制御を適用する例と図解付きの説明がみつかりました。(ありがとうございます。)またさらに調べたところ、こちらのスクリプトをベースにしたものが最も期待に近い動作ができました。(ありがとうございます。)
早速ですが、スクリプトは以下のようにしてみました。
早速ですが、スクリプトは以下のようにしてみました。
#!/bin/bash SWITCH=$1 # "on" or "off" DEVICE=$2 # "eth0", "br0", etc. RATE=$3 # for example "1000m" rate=`echo $RATE | sed -s 's/m//g'`000 CONFIG_HZ=250 burst=$(($rate/$CONFIG_HZ)) #limit=$(($burst*10)) #echo burst: $burst if [ "$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 rmmod ifb rmmod act_mirred tc qdisc del dev $DEVICE root fi if [ "$SWITCH" = "on" ]; then echo "--- Load ifb module ---" modprobe ifb sleep 1 ip link add dev ifb0 type ifb ip link set dev ifb0 up echo "--- Traffic Shape ${DEVICE} ---" tc qdisc add dev $DEVICE root handle 1: htb default 1 tc class add dev $DEVICE parent 1: classid 1:1 htb rate ${RATE}bit ceil ${RATE}bit burst ${burst}kbit cburst ${burst}kbit echo "--- Mirror $DEVICE to ifb0 ---" modprobe act_mirred sleep 1 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 tc filter add dev $DEVICE parent ffff: protocol ipv6 u32 match u32 0 0 flowid 1:2 action mirred egress redirect dev ifb0 echo "--- Traffic Shape ifb0 ---" tc qdisc add dev ifb0 root handle 1: htb default 1 tc class add dev ifb0 parent 1: classid 1:1 htb rate ${RATE}bit ceil ${RATE}bit burst ${burst}kbit cburst ${burst}kbit fi exitスクリプト名はたとえば、/usr/local/sbin/tcap.sh (chmod +x) とすると、制限は以下のようにするとかかります。
tcap.sh off enp1s0f0 #初期化 tcap.sh on enp1s0f0 150m制限解除(初期化)は以下のようにします。
tcap.sh off enp1s0f0転送制限のあるサーバに対して事前に転送容量から上限のスピードをはじき出してあらかじめ制限をかけたい場合などに有効だと思います。今回は以上です。それでは。
コメント
コメントを投稿