Скажем, у меня есть простая иерархия 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 составляет 100 кбит/с, а общий максимум для дочерних классов htb составляет 160 кбит/с.

Как ядро ​​будет обрабатывать все три дочерних элемента, генерирующих трафик с максимальной скоростью? Могу ли я использовать sfq-посредника для обеспечения справедливой обработки совокупного трафика в этом случае?

Что еще более важно, как ядро ​​решает, какой трафик пропускать, если общий генерируемый трафик превышает пропускную способность аппаратного интерфейса?

1
Tenders McChiken 12 Авг 2020 в 12:20

1 ответ

Общая рекомендация для HTB — убедиться, что «сумма ставок ребенка класс равен или меньше, чем ставка родителя".

Если дочерние классы допускают более высокие скорости, то HTB превысит лимит пропускной способности. Ограничение для родителя не применяется, оно просто используется для расчетов «заимствования полосы пропускания» (в соответствии с ceil rate). Фактическое ограничение пропускной способности применяется только дочерним (конечным) классом.

По крайней мере, так это объяснялось в списках рассылки много лет назад:

Если ceil родительского класса меньше суммы ceil дочерних классов, то дочерние классы могут потреблять больше пропускной способности, чем позволяет родительский класс. Это происходит потому, что родительский класс никогда не проверяется! Родительский класс проверяется только в том случае, если дочерний класс превысил ставку и хочет заимствовать у родителя.

https://www.spinics.net/lists/lartc/msg08619.html

Это очень старая документация, но она должна применяться и сегодня.

3
frostschutz 10 Авг 2020 в 11:32
Извинения @frostschutz. Мой вопрос был плохо сформулирован, и это не то, что я пытаюсь выяснить. Что я хочу знать, так это то, как ядро ​​​​решает, какой трафик пропускать, если общий генерируемый трафик превышает пропускную способность интерфейса (не только корневого htb). Отбрасывает ли он пакеты случайным образом или использует какую-то скрытую очередь? Я отредактировал свой плохо написанный вопрос, чтобы отразить это.
 – 
Tenders McChiken
12 Авг 2020 в 12:23