
допустим, у меня есть простая иерархия 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
Общая рекомендация при использовании HTB — убедиться, что «сумма ставок дочернего класса равна или меньше ставки родительского класса".
Если дочерние классы допускают более высокие скорости, то HTB превысит ограничение пропускной способности. Ограничение на родительском классе не применяется, оно просто используется для расчетов "заимствования пропускной способности" (в соответствии с ceil rate). Фактическое ограничение пропускной способности применяется только дочерним (конечным) классом.
Или, по крайней мере, так это объяснялось в почтовых рассылках много лет назад:
Если ceil родительского класса меньше суммы ceil дочерних классов, то дочерние классы могут потреблять больше пропускной способности, чем родительский класс, по-видимому, позволяет. Это происходит, потому что родительский класс никогда не проверяется! Родительский класс проверяется только в том случае, если дочерний класс превысил скорость и хочет занять у родителя.
https://www.spinics.net/lists/lartc/msg08619.html
Это очень старая документация, но она должна применяться и сегодня.