Динамическое ограничение скорости (чтоб по максимуму использовать ширину канала)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

10puu
Сообщения: 20

Динамическое ограничение скорости

Сообщение 10puu »

Есть канал, скажем 512 Кбит/с
И есть 3 небольшие группы клиентов: лимитчики, качки и геймеры.

Для качков надо где то 100 гигов в месяц
Для лимитчиков и геймеров 3 гига достаточно.

Идея такая:
Для геймеров сделать максимальный приоритет.
Для лимитчиков приоритет чуть ниже,
Для качков самый низкий

И еще.
хочется для безлимитчиков сделать максимальный приоритет для серфа, а для закачек пониже.
т.е. если кому то вздумается походить по страничкам, то под эти нужды выделялось бы скажем процентов 80 максимально возможной скорости в этот момент.

Есть идеи?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Динамическое ограничение скорости

Сообщение KiWi »

QoS.
Настраивается через тот же tc(prio).
Спасибо сказали:
zkrvova
Сообщения: 280

Re: Динамическое ограничение скорости

Сообщение zkrvova »

10puu писал(а):
18.03.2008 23:24
ЗАДАЧА
хочется для безлимитчиков сделать максимальный приоритет для серфа, а для закачек пониже.
т.е. если кому то вздумается походить по страничкам, то под эти нужды выделялось бы скажем процентов 80 максимально возможной скорости в этот момент.

Есть идеи?


Я например незнаю как это реализовать.
Потому что:
пока никто не будет серфить то весь канал забьют закачки, но если ктото начнёт серфить то пока произойдёт перераспределение скорости то будет казаться что инет медленный. А так как каждый файл на странице открывается своим потоком то тут совсем будент плохо, т.к. перераспредлеляться будет всё медленно.
Спасибо сказали:
10puu
Сообщения: 20

Re: Динамическое ограничение скорости

Сообщение 10puu »

А если сквидом ограничить количество потоков?
Спасибо сказали:
Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: Динамическое ограничение скорости

Сообщение Olden Gremlin »

посмею предложить, как вариант в сторону "копать отсюда и до обеда", следующий вариант.
рисуем скрипт tcng:

Код:

olden@og:~/tmp/shaper$ cat prio-test-linuxforum.ru-showtopic=63753 #define IFACE0 vlan206 #define IPADDR 193.34.140.0 #define RATE_GREN 10240 // 10240 kbps = 10Mbps #define R2Q 7 $rate_yellow = RATE_GREN/10; $cbs = $rate_yellow/10; $pbs = $cbs/2-$cbs/10; $meter = trTCM( cir $rate_yellow kbps, cbs $cbs kB, pir RATE_GREN kbps, pbs $pbs kB ); dev IFACE0 { egress { class (<$high>) if tcp_dport == PORT_HTTP || tcp_dport == PORT_HTTPS; class (<$high>) if ip_src/26 == IPADDR; class (<$icmp_class>) if ip_proto == IPPROTO_ICMP; class (<$medium>) if trTCM_green( $meter ); class (<$low>) if trTCM_yellow( $meter ); drop if trTCM_red( $meter ); drop if 1; htb ( r2q R2Q ) { class ( rate RATE_GREN kbps ) { $high = class ( rate RATE_GREN kbps ) { sfq ( perturb 20s ); } $medium = class ( rate RATE_GREN kbps ) { sfq ( perturb 10s ); } $icmp_class = class ( rate $rate_yellow kbps ) { fifo ( limit 100kB ); } $low = class ( rate $rate_yellow kbps ) { sfq ( perturb 10s ); } } } } } // mbps = 1024 kbps = 1024 * 1024 bps => byte/s // mbit = 1024 kbit => kilo bit/s. // mb = 1024 kb = 1024 * 1024 b => byte // mbit = 1024 kbit => kilo bit
транслируем его в команды tc:

Код:

olden@og:~/tmp/shaper$ tcng -r prio-test-linuxforum.ru-showtopic=63753 | sed "s/\([a-z]\)\/\([a-z]\)/\1 action \2/" tc qdisc del dev vlan206 root # ============================== Device vlan206 =============================== tc qdisc add dev vlan206 handle 1:0 root dsmark indices 16 default_index 0 tc qdisc add dev vlan206 handle 2:0 parent 1:0 htb r2q 7 tc class add dev vlan206 parent 2:0 classid 2:1 htb rate 1280000bps tc class add dev vlan206 parent 2:1 classid 2:2 htb rate 1280000bps tc qdisc add dev vlan206 handle 3:0 parent 2:2 sfq perturb 20 tc class add dev vlan206 parent 2:1 classid 2:3 htb rate 1280000bps tc qdisc add dev vlan206 handle 4:0 parent 2:3 sfq perturb 10 tc class add dev vlan206 parent 2:1 classid 2:4 htb rate 128000bps tc qdisc add dev vlan206 handle 5:0 parent 2:4 bfifo limit 102400 tc class add dev vlan206 parent 2:1 classid 2:5 htb rate 128000bps tc qdisc add dev vlan206 handle 6:0 parent 2:5 sfq perturb 10 tc filter add dev vlan206 parent 2:0 protocol all prio 1 tcindex mask 0x7 shift 0 tc filter add dev vlan206 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:5 tc filter add dev vlan206 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:3 tc filter add dev vlan206 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:4 tc filter add dev vlan206 parent 2:0 protocol all prio 1 handle 1 tcindex classid 2:2 tc filter add dev vlan206 parent 1:0 protocol all prio 1 handle 1:0:0 u32 divisor 1 tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u8 0x6 0xff at 9 offset at 0 mask 0f00 shift 6 eat link 1:0:0 tc filter add dev vlan206 parent 1:0 protocol all prio 1 handle 1:0:1 u32 ht 1:0:0 match u16 0x50 0xffff at 2 classid 1:1 tc filter add dev vlan206 parent 1:0 protocol all prio 1 handle 2:0:0 u32 divisor 1 tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u8 0x6 0xff at 9 offset at 0 mask 0f00 shift 6 eat link 2:0:0 tc filter add dev vlan206 parent 1:0 protocol all prio 1 handle 2:0:1 u32 ht 2:0:0 match u16 0x1bb 0xffff at 2 classid 1:1 tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u32 0xc1228c00 0xffffffc0 at 12 classid 1:9 tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u8 0x1 0xff at 9 classid 1:2 tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:0 police index 3 rate 1280000bps burst 41984 mpu 0 action drop action continue tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:3 police index 4 rate 128000bps burst 104448 mpu 0 action continue action pass tc filter add dev vlan206 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:4

справедливый вопрос: и че мы тут собственно сделали? ;)
для внешнего интерфейса (смотрит в интернет) нарисовали...
во первых нарисовали счетчик трафика в разрезе trTCM;
потом сказали о том, что трафик на порты 80 и 443 (http и https) - определен по классу $high;
трафик с адресов нашей сети (сеть с реальными ip - так что это надо учитывать) - то-же в класс $high;
icmp - то-же можно особо не ограничивать, его вообще пустим в fifo;
не, а дальше по-счетчикам, в зеленой полосе пускаем все в класс $medium, который работает практически как и $high, в желтой полосе - резка урезаем потребности пользователей, ну и красную полосу - просто рубим на корню.
в резуьтате имеем HTTP и HTTPS трафик в наивысшем приоритете, а все остальные протоколы - курят на общих основаниях.
но! это еще половина дела. это были правила для egress внешнего интерфейса, теперь нарисуем что-то подобное для внутреннего интерфейса (ну не умеет linux делать нормальный rate-limit, вот и приходится изголяться "симметричными" правилами):

Код:

olden@og:~/tmp/shaper$ cat prio-test-linuxforum.ru-showtopic\=63753\:part2 #define IFACE0 eth0 #define IPADDR 193.34.140.0 #define IPADDR_RFC1918 192.168.0.0 #define RATE_GREN 10240 // 10240 kbps = 10Mbps #define R2Q 7 $rate_yellow = RATE_GREN/10; $cbs = $rate_yellow/10; $pbs = $cbs/2-$cbs/10; $meter = trTCM( cir $rate_yellow kbps, cbs $cbs kB, pir RATE_GREN kbps, pbs $pbs kB ); dev IFACE0 { egress { class (<$high>) if tcp_sport == PORT_HTTP || tcp_sport == PORT_HTTPS; class (<$high>) if ip_dst/26 == IPADDR; class (<$icmp_class>) if ip_proto == IPPROTO_ICMP; class (<$low>) if ip_dst/27 == IPADDR_RFC1918 && trTCM_green( $meter ); class (<$medium>) if trTCM_green( $meter ); class (<$low>) if trTCM_yellow( $meter ); drop if trTCM_red( $meter ); drop if 1; htb ( r2q R2Q ) { class ( rate RATE_GREN kbps ) { $high = class ( rate RATE_GREN kbps ) { sfq ( perturb 20s ); } $medium = class ( rate RATE_GREN kbps ) { sfq ( perturb 10s ); } $icmp_class = class ( rate $rate_yellow kbps ) { fifo ( limit 100kB ); } $low = class ( rate $rate_yellow kbps ) { sfq ( perturb 10s ); } } } } } // mbps = 1024 kbps = 1024 * 1024 bps => byte/s // mbit = 1024 kbit => kilo bit/s. // mb = 1024 kb = 1024 * 1024 b => byte // mbit = 1024 kbit => kilo bit
ну и переведем это в синтаксис tc:

Код:

olden@og:~/tmp/shaper$ tcng -r prio-test-linuxforum.ru-showtopic\=63753\:part2 | sed "s/\([a-z]\)\/\([a-z]\)/\1 action \2/" tc qdisc del dev eth0 root # ================================ Device eth0 ================================ tc qdisc add dev eth0 handle 1:0 root dsmark indices 16 default_index 0 tc qdisc add dev eth0 handle 2:0 parent 1:0 htb r2q 7 tc class add dev eth0 parent 2:0 classid 2:1 htb rate 1280000bps tc class add dev eth0 parent 2:1 classid 2:2 htb rate 1280000bps tc qdisc add dev eth0 handle 3:0 parent 2:2 sfq perturb 20 tc class add dev eth0 parent 2:1 classid 2:3 htb rate 1280000bps tc qdisc add dev eth0 handle 4:0 parent 2:3 sfq perturb 10 tc class add dev eth0 parent 2:1 classid 2:4 htb rate 128000bps tc qdisc add dev eth0 handle 5:0 parent 2:4 bfifo limit 102400 tc class add dev eth0 parent 2:1 classid 2:5 htb rate 128000bps tc qdisc add dev eth0 handle 6:0 parent 2:5 sfq perturb 10 tc filter add dev eth0 parent 2:0 protocol all prio 1 tcindex mask 0x7 shift 0 tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:3 tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:5 tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:4 tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 1 tcindex classid 2:2 tc filter add dev eth0 parent 1:0 protocol all prio 1 handle 1:0:0 u32 divisor 1 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u8 0x6 0xff at 9 offset at 0 mask 0f00 shift 6 eat link 1:0:0 tc filter add dev eth0 parent 1:0 protocol all prio 1 handle 1:0:1 u32 ht 1:0:0 match u16 0x50 0xffff at 0 classid 1:1 tc filter add dev eth0 parent 1:0 protocol all prio 1 handle 2:0:0 u32 divisor 1 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u8 0x6 0xff at 9 offset at 0 mask 0f00 shift 6 eat link 2:0:0 tc filter add dev eth0 parent 1:0 protocol all prio 1 handle 2:0:1 u32 ht 2:0:0 match u16 0x1bb 0xffff at 0 classid 1:1 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc1228c00 0xffffffc0 at 16 classid 1:9 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u8 0x1 0xff at 9 classid 1:2 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffffe0 at 16 classid 1:0 police index 3 rate 1280000bps burst 41984 mpu 0 action drop action continue tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffffe0 at 16 classid 1:3 police index 4 rate 128000bps burst 104448 mpu 0 action continue action pass tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffffe0 at 16 classid 1:b tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:0 police index 3 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:4 police index 4 tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:b

собственно что делается в этих правилах - разбираемч по аналогии.
в принципе они симетричны первым, но есть один момент.
на сеть 192.168.0.0/27 трафик даже в зеленой полосе огрничивается классом $low (это так... для примера).
собственно, все... ;)
лопату дал - дальше копаем самостоятельно! :)
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
10puu
Сообщения: 20

Re: Динамическое ограничение скорости

Сообщение 10puu »

Порылся прилично.
Мои рассуждения.
Вероятно я где то ошибаюсь. На практике пока не применял. Как канал заработает начну тестить. Хочется удовлетворительных результатов.

В первую очередь меня заботят лимитчики, потом геймеры, а качкам как повезет.

сначала схема:
ADSL - канал 512 килобит.
У прова есть бесплатный игровой сервер.
Сервер А:
eth1 смотрит на ADSL и является шлюзом для сервера Б.
eth0 смотрит в сеть - только лимитчики.
Сервер Б:
eth1 - шлюзом для него является eth1 сервера А.
eth0 смотрит в сеть - геймеры и качки
На обоих серваках стоит кэширующий SQUID ограничивая вэб закачки.

Начнем с качков

Сервер Б.

Входящий траф т.е. трафик с ADSL является входящим для eth1, но для eth0 он является исходящим, поэтому на eth0 выделяем полосу пожирнее и с наивысшим приоритетом для геймеров. Остальное пилим на равные части - пусть качки сами думают - качать или по страничкам ходить.

Теперь eth1 - тут исходящий траф является запросным.
Тут скорее всего, ограничиваем до 50-80 килобайт и делим на 3 полосы.
Пакетам на игровой сервак даем приоритет 0, сюда же, предварительно отфильтровав iptablts, помещаем ACK пакеты. Для Вэба даем приоритет 1 и приоритет 2 всем остальным.

Сервер А.

eth0 - тут лимитчики - народ очень бережливый и вероятность того, что они забьют канал равна 0. Тем более их трафик не превысит 2% от общего.
На eth0 вообще ни каких ограничений не делаем.

ТЕПЕРЬ САМОЕ ВАЖНОЕ.
eth1 - тут все запутано, не знаю, может и по-другому как то стоит сделать...
Итак. исходящий тут является и запросным как для сервера А, так и для сервера Б, и в тоже время для сервера Б он является входящим.
правила для eth1 сервера А

Тут видимо стоит ограничить канал до 460 килобит, а можеть чуть больше - меньше, поделить на 2 равные полосы. Первую полосу отдать пакетам для сервака качков, а вторую, дефолтную - лимитчикам, и кроме того дать ей максимальный приоритет.
Первая полоса всегда будет занимать у второй. Потому вторая полоса должна иметь достаточно большой запас "энергии" для удовлетворения нужд серферов-лимитчиков.

В первой полосе фильтруем:
- пакеты геймеров с приоритетом 0,
- пакеты НА сервер Б с приоритетом 1
- пакеты ОТ сервера Б с приоритетом 2.
Должен получиться такой своеобразный саморегулирующий эффект: чем больше получаем - тем сложнее отдавать и слать запросы, и соответственно чем меньше просим, тем меньше получаем, что в свою очередь не даст забиться каналу ADSL...
Спасибо сказали: