Linux qos: tc DRR qdisc が動作しない

Linux qos: tc DRR qdisc が動作しない

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

HTB と同じ機能を持っていますが、トークンで満たされたバケットを使用する代わりに、各キューにいくつかの Dificit Counter を割り当てます。パケットを送信すると、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

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

答え1

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

参照:男 tc-drr

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

答え2

drrはスケジューラ、それでも HTB でクラスに異なる帯域幅を割り当てる必要があります。quantum を 600 と 1400 に指定すると、1:2 の比率に近くなるとお考えだと思います。実際はそうではありません。輻輳の場合にのみ、構成でその比率に近づく可能性があります。たとえば、複数の UDP ストリームを作成し、問題の 2 つを測定しますが、それでも期待どおりにはなりません。

関連情報