Linuxのトラフィック制御機能を使ってKVM VM出力帯域幅を制限し、フィルターを使用して高速クラスと(デフォルト)特定のVMの低速クラス。
物理ネットワーク出力インターフェイスは「eth0」(1ギガビット)であり、「bond0」ボンディングデバイスの一部です。 「bond0」は、仮想マシンの仮想ネットワークカード「vmn {0,1,2,3,4}」に沿った「br0」の一部です。
VMネットワークパケットからインターネットへのパスは次のとおりです。eth0(vm)-> vmn0(ホスト)-> br0(ホスト)-> bond0(ホスト)-> nic0(ホスト)- >インターネット。
私は2つのクラスを設定しようとしています:
ホストで次のアプローチを試しました。
# If the qdisc was previously created, delete it
tc qdisc del dev vmn0 root
# New HTB qdisc. By default it goes to our slow traffic class (1:11)
tc qdisc add dev vmn0 root handle 1: htb default 11
# Classes. 1:1 default (500 Mbit) ; 1:10 -> fast (500Mbit); 1:11 -> slow (100Mbit)
tc class add dev vmn0 parent 1: classid 1:1 htb rate 500000kbit ceil 500000kbit quantum 1500
tc class add dev vmn0 parent 1:1 classid 1:10 htb rate 1000kbit ceil 500000kbit
tc class add dev vmn0 parent 1:1 classid 1:11 htb rate 1000kbit ceil 100000kbit
# Associates the fast traffic class with our desireed networks
tc filter add dev vmn0 parent 1: protocol ip prio 10 u32 match ip dst 10.0.1.0/24 flowid 1:10
tc filter add dev vmn0 parent 1: protocol ip prio 10 u32 match ip dst 10.0.2.0/24 flowid 1:10
# Default match if any of previous rules not applied to a slow rate 1:11. Superfluous like traffic goes to 1:11 by default?
tc filter add dev vmn0 parent 1: protocol ip prio 20 u32 match ip dst 0.0.0.0/0 flowid 1:11
VM "vma"、ネットワークデバイス "vmn0"が関連付けられ、IPアドレス "10.0.1.2"から、 "iperf-s"を実行しました。
別のホストとIPアドレス「10.0.2.2」のa VM "vmb"から、 "iperf -c 10.0.1.2"を実行すると、次の結果が得られました。
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 57.8 MBytes 485 Mbits/sec 0 1.84 MBytes
[ 4] 1.00-2.00 sec 56.2 MBytes 472 Mbits/sec 0 1.84 MBytes
[ 4] 2.00-3.00 sec 56.2 MBytes 472 Mbits/sec 0 1.84 MBytes
[ 4] 3.00-4.00 sec 55.0 MBytes 461 Mbits/sec 0 1.84 MBytes
[ 4] 4.00-5.00 sec 56.2 MBytes 472 Mbits/sec 0 1.84 MBytes
「10.0.2.2」のレートは500Mbitに制限されています。
ここで、別のホストのVM "vmc"とIPアドレス "192.168.1.2"から:
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 57.3 MBytes 481 Mbits/sec 0 1.21 MBytes
[ 4] 1.00-2.00 sec 56.4 MBytes 473 Mbits/sec 0 1.21 MBytes
[ 4] 2.00-3.00 sec 56.7 MBytes 476 Mbits/sec 0 1.21 MBytes
[ 4] 3.00-4.00 sec 56.7 MBytes 476 Mbits/sec 0 1.21 MBytes
[ 4] 4.00-5.00 sec 56.5 MBytes 474 Mbits/sec 0 1.21 MBytes
これは私が期待したものではありません。最大100メガビット(デフォルトのクラスであり、以前に一致しなかったものと一致する)になるはずです。
誰かがこれを手伝うことができますか?
ついにそれが機能するようになりました。
これらの行は、私が行っていることを示しています。
tc qdisc del dev vmn0 root
tc qdisc add dev vmn0 root handle 1: htb default 11 r2q 83
tc class add dev vmn0 parent 1: classid 1:1 htb rate 100000kbit ceil 100000kbit quantum 1500
tc class add dev vmn0 parent 1:1 classid 1:10 htb rate 1000kbit ceil 500000kbit
tc class add dev vmn0 parent 1:1 classid 1:11 htb rate 1000kbit ceil 100000kbit
tc filter add dev vmn0 parent 1: protocol ip prio 10 u32 match ip src 10.0.2.0/24 flowid 1:10
Dst 10.0.1.0/24でフィルターを削除した後、トラフィックはレート制限され始めました。予想どおり、トラフィックがフィルタールールに一致しない場合は、デフォルトのクラス(1:11、遅いクラス)に移動します。
トラフィックは送信と受信の両方を実行するため、ルール10.0.1.0/24で常に一致していました。そのため、トラフィックはそこで分類され、高速パスが与えられました。