良い一日、
次のような状況があります。あるマシンから別のマシンへのデータの 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 パラメータに関係していますか? また、データの送信中に、すべてのクラスに負の量のトークンがあることも観察しました。これは悪いですか?その場合、どのパラメーターをどのように調整すればよいですか?
前もって感謝します!