Привет. Представим, что есть:
- VPS сервер, download/upload скорость не гарантирована, может 10 mbps, а может и 500 mbps
- VPS сервер является WG сервером, образует со своими клиентами локалку, клиенты используют сервер как gateway шлюз в инет
- Несколько заметок о движении трафика:
3.1. когда клиент download: сервер download -> трафик попадает на WG интерфейс (возможно несколько flow, если загрузка данных от > 1 хоста в инете) -> из WG интерфейса выходит один encrypted flow (даже если входящих flow > 1) -> eth0 -> хост клиента
3.2. когда клиент upload: хост клиента (всегда один encrypted flow) -> eth0 сервера -> порт WG -> трафик выходин из WG интерфейса, возможно трансформируется в несколько flow (если отдаём что-то нескольким хостам в инете) -> eth0
Из п3 видна асимметрия - когда клиент загружает данные, то сервер отдаёт хосту в локалке данные всегда в одном потоке, когда хост в локалке выгружает данные куда-то в инет, то из сервера может выходить несколько потоков (flow - уникальный набор src/dest ip/port).
Почему это важно? А потому что это мешает адекватно (относительно честно) разделить uplink канал сервера. Дефолтный fq_codel qdisc делит канал честно между всеми flow, но все download клиента упакованы в один flow, в то время как upload потоков может быть множество. Следовательно, скорость выгрузки клиентов локалки потенциально может забить всю пропускную способность канала и быть сильно больше download.
А что для меня честно? У каждого клиента своя равная доля канала, где upload <= download (желательно меньше). fq_codel сделает честную максимальную download скорость между всеми клиентами, а upload скорость будет зависеть от количества потоков (активных коннектов), не подходит.
Если бы у сервера была бы гарантированная минимальная скорость uplink канала, то я мог бы заюзать одну CAKE qdisc на WG egress c лимитом в 70% от min uplink speed (download клиентов); Входящий трафик из WG направить IFB интерфейс, где применил бы ещё один CAKE c лимитом в 30% от min uplink speed (upload клиентов). CAKE’и классифицировали бы трафик по host’у и flow, и всё бы было как хотел - у каждого хоста своя доля (отдельно upload и download), внутри этой доли у каждого flow свой кусочек канала.
Но проблема в том, что у сервера нет гарантированной bandwidth speed, следовательно, я не могу заюзать CAKE, без указания максимального лимита он бесполезен (т.к. он не будет узким местом).
Что можно сделать, какие идеи, какую qdisc можно использовать, как разделить канал честно?

