Исходные данные: есть ограниченная полоса, для управления трафиком пользователей используется шейпер, созданный с помощью tc, дисциплина htb. Полоса делится на несколько классов с разными приоритетами. Для помещения трафика в каждый класс используется фильтрация по IP пользователя. В каждый класс помещается несколько пользователей. Распределение между классами замечательно работает.
Проблема: ожидается что в пределах одного класса полоса будет делиться между пользователями примерно равномерно. Т.е. классу в данный момент доступно, допустим, 12 мб/с, в нем три пользователя. Один пользователь может занять все 12, если работают двое - каждому достанется по 6, если трое - каждому по 4. По факту так не получается. Выделяемая полоса зависит от количества сессий. Один пользователь может запустить какой-нибудь торрент и съест практически всю полосу, выделенную классу, а двум другим, которые хотят, например, почитать почту, не остается почти ничего.
Пример создания класса:
#/sbin/tc class add dev eth0 parent 1:2 classid 1:20 htb rate 8000Kbit ceil 12000Kbit prio 1
# /sbin/tc qdisc add dev eth0 parent 1:20 handle 20 sfq perturb 10
# /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 172.16.0.1/32 classid 1:20
# /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 172.16.0.2/32 classid 1:20
# /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip dst 172.16.0.3/32 classid 1:20
Нужно, чтобы когда работают все трое (172.16.0.1, .2, .3) каждому доставалось примерно по 4 Мбит. А не так, чтобы 1 запустил 100 сессий и съел всё, а 2 и 3 запустили по одной сессии и ничего не получают. Предположительно здесь можно применить flow hash в filter, но пока не понимаю как. Мануалы читал, но в голове сумбур.
Отягчающие обстоятельства: По условиям эксплуатации сети приоритизация допустима только по IP пользователей, устраивать приоритизацию по типам сервисов (почта, серфинг, торрент и т.п.) - не предлагать. Создавать отдельный класс для каждого пользователя - выход, но плохой (наоборот, хочется от этого уйти по ряду причин).