0

良い一日、

次のような状況があります。あるマシンから別のマシンへのデータの 4 つの TCP ストリーム。各ストリームには、独自の宛先 TCP ポートがあります。4 つのストリームには、高、中、低、バルクの異なる優先度があります。高、中、低は 1.67Mbit/s を生成し、バルクは 10Mbit/s を生成します。(トラフィックの生成に使用される iperf3)。各ストリームのパケットは適切な DiffServ マーク (DSCP) でマークされ、このマークは HTB qdisc でのトラフィックの分類に使用されます。

目標: HTB qdisc は、高い優先度のストリームが必要な 1.67Mbit/s を取得し、中程度の優先度も 1.67Mbit/s が保証されるように構成する必要がありますが、優先度はわずかに低く、残りのトラフィックは 50kbit を保証する必要があります。 /秒。各ストリームがアイドル状態で、ストリームが最初に指定されたよりも多くの帯域幅を生成する場合、各ストリームはリンク全体を使用できる必要があります。

トラフィックの生成:

High priority:
iperf3 -c 192.168.88.254 -p 5150 -t 62 -b 1.67M -l 128 -S 224 
Medium priority:
iperf3 -c 192.168.88.254 -p 5160 -t 62 -b 1.67M -l 4K -S 160 
Low priority:
iperf3 -c 192.168.88.254 -p 5170 -t 62 -b 1.67M -l 4K -S 96 
Bulk:
iperf3 -c 192.168.88.254 -p 5180 -t 62 -b 10M -l 4K -S 0 

HTB qdisc の構成

NI="eth2"
AC="sudo /sbin/tc class add dev "

# Delete previous qdiscs
sudo /sbin/tc qdisc del dev $NI root

# Add HTB as root with default class 40 for uncategorized traffic
sudo /sbin/tc qdisc add dev $NI root handle 1: htb default 40
sudo /sbin/tc class add dev $NI parent 1: classid 1:1 htb rate 3.5mbit ceil 1000mbit

# high priority stream DSCP 224 - 1110 0000 - 0xE0
$AC $NI parent 1:1 classid 1:10 htb rate 1.7mbit ceil 1000mbit prio 1
# medium priority stream 
$AC $NI parent 1:1 classid 1:20 htb rate 1.7mbit ceil 1000mbit prio 2
# low priority stream
$AC $NI parent 1:1 classid 1:30 htb rate 50kbit ceil 1000mbit prio 3
# bulk stream
$AC $NI parent 1:1 classid 1:40 htb rate 50kbit ceil 1000mbit prio 4 

# Add filters to classify packets based on dscp mark

# high priority DSCP 224 - 1110 0000 - 0xE0
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 1 u32 match ip tos 0xE0 0xff flowid 1:10
# medium priority DSCP 160 - 1010 0000 - 0xA0
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 2 u32 match ip tos 0xA0 0xff flowid 1:20
# low priority DSCP 96 - 1100 0000 - 0x60
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 3 u32 match ip tos 0x60 0xff flowid 1:30
# bulk DSCP 0 - 0000 0000 - 0x00
sudo /sbin/tc filter add dev $NI protocol ip parent 1: prio 4 u32 match ip tos 0x00 0xff flowid 1:40

トラフィックは正しく分類されます。tc クラスの統計で関連するカウンターが上昇しているのを確認できます。これを何度も再確認しました。

問題: この構成では、高および中優先順位のストリームに帯域幅が正しく割り当てられます。ロープライオとバルクも 50kbit を受け取ります。ただし、ルートclass1:1レートとして指定された値、つまり 3.5mbitを超えてリンクをプッシュすることはできません。

私が読んだ HTB に関するすべての記事とマニュアルでは、「レート」パラメーターはクラスに対する最低保証レートであり、「ceil」は取得できる最大量であると述べられていました。私の場合、「レート」はリンクを指定された値に制限しているようです。これは間違いなく、望ましい動作であり、期待される動作ではありません。

ルート クラスの「レート」パラメータを「ceil」と同じ値、つまり 1000mbit に設定すると、優先順位付けは行われず、使用可能な帯域幅はすべてのフロー間で均等に分割されます。これは、使用可能な帯域幅が変動する場合、prio トラフィックが 1.67Mbit/s 未満になるため、望ましい動作ではありません。

ルート クラスの "rate" パラメータの意味を誤解していませんか? この問題は、「量子」などの HTB パラメータに関係していますか? また、データの送信中に、すべてのクラスに負の量のトークンがあることも観察しました。これは悪いですか?その場合、どのパラメーターをどのように調整すればよいですか?

前もって感謝します!

4

0 に答える 0