
単純なHTB階層があるとします(man 8 tc-htb
)子HTBクラスに指定された合計帯域幅を設定する超過ルート htb クラスに指定された合計帯域幅:
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 70kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 70kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 70kbps
ここで、ルート htb クラスの最大値は 100kbps ですが、子 htb クラスの集合的な最大値は 160kbps です。
カーネルは、最大レートでトラフィックを生成する 3 つの子プロセスすべてをどのように処理するのでしょうか。この場合、集約トラフィックの公平な処理を保証するために、中間の sfq を使用できますか。
さらに重要なのは、生成されるトラフィックの合計がハードウェア インターフェイスの帯域幅を超えた場合に、カーネルはどのトラフィックを通過させるかをどのように決定するかということです。
答え1
HTBの一般的な推奨事項は、「子クラスのレートの合計が親クラスのレートと等しいかそれより小さい「」。
子クラスがより高いレートを許可する場合、HTB は帯域幅制限を超えます。親の制限は強制されず、単に「帯域幅の借用」計算 (上限レートによる) に使用されます。実際の帯域幅制限は、子 (リーフ) クラスによってのみ強制されます。
少なくとも、何年も前にメーリングリストでは次のように説明されていました。
親クラスの ceil が子クラスの ceil の合計よりも小さい場合、子クラスは親クラスが許可している帯域幅よりも多くの帯域幅を消費する可能性があります。これは、親クラスがチェックされないために発生します。親クラスは、子クラスがレートを超過し、親クラスから借りる場合にのみチェックされます。
https://www.spinics.net/lists/lartc/msg08619.html
これは非常に古いドキュメントですが、現在でも適用されるはずです。