web-dev-qa-db-ja.com

Linux TCとのデフォルト(低速)一致での複数のネットワーク宛先の帯域幅制限

Linuxのトラフィック制御機能を使ってKVM VM出力帯域幅を制限し、フィルターを使用して高速クラスと(デフォルト)特定のVMの低速クラス。

物理ネットワーク出力インターフェイスは「eth0」(1ギガビット)であり、「bond0」ボンディングデバイスの一部です。 「bond0」は、仮想マシンの仮想ネットワークカード「vmn {0,1,2,3,4}」に沿った「br0」の一部です。

VMネットワークパケットからインターネットへのパスは次のとおりです。eth0(vm)-> vmn0(ホスト)-> br0(ホスト)-> bond0(ホスト)-> nic0(ホスト)- >インターネット。

私は2つのクラスを設定しようとしています:

  • 高速:宛先10.0.1.0/24および10.0.2.0/24への500Mbps発信
  • 遅い(デフォルト):他のすべての宛先に100Mbps発信

ホストで次のアプローチを試しました。

# 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メガビット(デフォルトのクラスであり、以前に一致しなかったものと一致する)になるはずです。

誰かがこれを手伝うことができますか?

1
vroman

ついにそれが機能するようになりました。

これらの行は、私が行っていることを示しています。

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で常に一致していました。そのため、トラフィックはそこで分類され、高速パスが与えられました。

2
vroman