web-dev-qa-db-ja.com

Linux qos:tc DRRqdiscが機能しない

Tcキューの規律DRR(Dificite Round Robin)があります。

HTBと同じ機能がありますが、トークンで満たされたバケットを使用する代わりに、すべてのキューにDificitCounterを割り当てるだけです。パケット送信時DCはパケットサイズによって減少します。DCがパケットサイズよりも小さい場合、DCはキューによって増加します。クォンタムと次のキューが処理されるため、チャネル幅(HTBに必要)を知らなくても、発信トラフィックをある比率で分割できます。 http://www.unix.com/man-page/linuxを参照)/8/tc-drr /

セットアップ:2つのホスト、172.16.1.1および172.16.1.2。

最初のホストでは、トラフィックをリッスンしています。

nc -l 8111
nc -l 8112

2番目のホストで速度を確認します。

pv /dev/zero | nc 172.16.1.1 8111
pv /dev/zero | nc 172.16.1.1 8112

これで速度は等しくなります(pvは、パイプラインを介したデータ転送の速度を測定できるユーティリティです)。 2番目のホストにDRRを追加します(上部のHTBは実際のチャネル速度制限をエミュレートするために使用されます):

tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc qdisc add dev eth0 parent 1:1 handle 2: drr
tc class add dev eth0 parent 2: classid 2:1 drr quantum 600
tc class add dev eth0 parent 2: classid 2:2 drr quantum 1400
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 8111 0xffff classid 2:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 8112 0xffff classid 2:2

速度は同じままです:(私は何が間違っているのですか?

4
Selivanov Pavel

回答:DRRはパケット自体をドロップしません。目的の動作を得るには、pfifo limit 50などのDRR子クラスに子qdiscsを追加して、子qdiscがパケットを効果的に無期限にキューに入れるのではなくドロップするようにします。解決策はここにあります: linux.org.ru thread

参照: man tc-drr

注制限は個々の子qdiscsによって処理されるため、この実装では、オーバーラン時に最長のキューからパケットがドロップされません。

5
Selivanov Pavel

drrはschedulerですが、htbを使用するクラスに異なる帯域幅を割り当てる必要があります。量子を600と1400と指定すると、1:2に近い比率になると思います。実際にはそうではありません。輻輳が発生した場合にのみ、設定でその比率に近づく可能性があります。複数のUDPストリームを作成し、問題の2つを測定しますが、それでも期待していることではありません。

3
Alex_www