У меня есть маршрутизатор / шлюз под Linux, я хочу добавить немного QoS, чтобы зарезервировать полосу пропускания для определенного потока. Это можно сделать с помощью iptables / netfilter и tc, но все примеры начинаются с того, что вам заранее известна общая доступная пропускная способность.
Проблема в том, что моя WAN - это движущееся соединение 3G с переменной производительностью. В первый день я могу иметь 5 Мбит / с, а в дождливый день 2 - до 2 Мбит / с. Как я могу гарантировать, что для моего потока 1 всегда будет доступно 100 Кбит / с с низкой задержкой?
Я подумал о сложном решении с ежедневным или ежечасным сценарием для проверки пропускной способности и динамического создания и применения сценариев QoS, но для меня это не очень хорошее решение.
Вы должны быть в состоянии достичь своей цели с помощью планировщика hfsc. У вас будет возможность зарезервировать часть полосы пропускания и предоставить гарантию низкой задержки с «реальным временем», другие классы будут пропорционально заполнять остальную полосу пропускания с помощью «линковки».
Здесь важно использовать реальное время, а не совместное использование ссылок, потому что реальное время, чтобы быть уверенным в возможности отправить пакет в самые последние миллисекунды, может остановить другой класс для отправки пакета.
Чтобы выполнить то, что вы хотите, вам необходимо установить высокий верхний предел для корневого класса (возможно, 10 МБ), но не использовать ul для конечных. Из-за способа, которым hfsc linkshare распределяет полосу пропускания между всеми классами "ls", они будут совместно использовать доступную полосу пропускания сверх значения m2, если оно больше.
Например, вы можете использовать такую настройку:
# dns, ntp, teamspeak
iptables -t mangle -A POSTROUTING -o eth0 -p udp -m multiport --dports 53,123,9987 -j CLASSIFY --set-class 1:100
# Default tcp
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -j CLASSIFY --set-class 1:200
# Default udp
iptables -t mangle -A POSTROUTING -o eth0 -p udp -j CLASSIFY --set-class 1:300
# ROOT QDISC - default goes on class 100 because it's probably arp gratuitous or whois since all ip traffic is already classified
tc qdisc add dev eth0 root handle 1:0 hfsc default 100
# ROOT CLASS - Interface eth0, noeud parent de la branche : 1:0, id de la branche : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 hfsc ls m2 10000kbit ul m2 10000kbit
# CLASS 100 - VOIP, DNS, NTP
tc class add dev eth0 parent 1:10 classid 1:100 hfsc sc m1 400kbit d 10ms m2 100kbit
# QDISC
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel quantum 300 noecn # fq_codel requires to change the quantum for low bandwitdth
# CLASS 200 - some tcp
tc class add dev eth0 parent 1:10 classid 1:200 hfsc ls m1 80kbit d 10ms m2 80kbit
# QDISC - some tcp
tc qdisc add dev eth0 parent 1:200 handle 210: fq_codel
# CLASS 300 - some udp
tc class add dev eth0 parent 1:10 classid 1:300 hfsc ls m1 20kbit d 10ms m2 20kbit # ratio tcp / udp will then be 4:1
# QDISC - some udp
tc qdisc add dev eth0 parent 1:300 handle 310: fq_codel quantum 300 noecn
Значения могут быть изменены в соответствии с вашими потребностями, особенно в классе 100, хотя я попытался записать эти числа, чтобы они соответствовали вашему 3G.
Вам следует прочитать больше о man tc-hfsc, эта почта, и Эта статья чтобы узнать больше о hfsc и о том, как это работает.