Перейти к содержимому
Калькуляторы

Linux шейпер гарантированная полоса (динамически) ...не работает, а должно

ВНИМАНИЕ МНОГО БУКАФФ, НО ИНАЧЕ НЕЛЬЗЯ

 

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

 

 

Я очень надеюсь, что объяснил достаточно подробно и понятно, что есть сейчас, прошу вас помочь решить поставленную задачу. ПО крайней мере у меня сейчас вопрос пока один основной - почему, когда я в головном скрипте иннициализации шейпера меняю STANDARD и STANDARD_CEIL к примеру на 1mbit - клиенты все равно кушают столько трафика, сколько им назначено, хотя должны не иметь возможности брать больше чем у родительского класса. Здесь я попал в тупик.

 

 

Итак.

 

Внешний интерфейс eth2

Внутренний интерфейс eth1

Общая скорость канала 100M

Виртуальный интерфейс для шейпера ifb0

 

Пакеты метятся с помощью iptables mark / ipset

1 - OUT_WORLD

2 - IN_WORLD

3 - OUT_LOCAL

4 - IN_LOCAL

5 - OUT_UAIX

6 - IN_UAIX

 

 

Задача:

 

Рядовые клиенты (для всех выделяется часть общей полосы +то, что недоиспользуется бизнес-абонентами через ceil - все это делится между всеми клиентами с ограничением максимума):

Каждому из клиентов(определяется по одному или нескольким IP адресам) ограничить полосу доступа к ресурсам мира и украины, скорости могут быть разными. Кроме того если задано ограничение т.н. "локальное" - тогда оно имеет приоритет и отдельные ограничения для ураины и мира не работают.

Пример:

клиент 1 - заданы ограничения мир-1Мб, украина-5Мб - клиент получает заявленные скорости.

клиент 2 - задано ограничение "локальное"-1Мб - клиент получает максимальную скорость 1Мб не зависимо от типа трафика, даже если например у него стоит ограничение мир-512Кб - это не будет иметь значения, т.к. тип ограничения "локальный" является более приоритетным вне зависимости от того увеличивает он скорость клиенту или уменьшает ее по отношения к возможно установленным ограничениям для украины и мира. Надеюсь понятно. :)

 

Бизнес-абоненты (гарантировано выделяется часть общей полосы и так же гарантировано делится между абонентами согласно их пакетов. Рядовые клиенты не могут отобрать траффик у бизнес-абонентов, ровно как и бизнес абоненты друг у друга. Если бизнес-абоненты недоиспользуют полосу - излишек уходит на нужды рядовых клиентов через ceil):

Эта часть пока не реализована в деталях. С этим нужна помощь.

 

Я остановился на моменте, когда не могу выделить гарантированную полосу для бизнес абонентов в целом. Для теста я ставил рядовым клиентам ограничение(общее для всех) к примеру 1Мб и ceil 1mbit - но клиенты все равно получали всю полосу... т.е. где-то закралась ошибка и мне пока так и не удалось ее найти.

 

Теперь подробности реализации:

 

Ниже приведен скрипт иннициализации шейпера, правила по которым будут строится ограничения для клиентов приведу чуть ниже на примере.

----------------------------------------------- Скрипт иннициализации шейпера -------------------------------------

INT_I="eth1" # Внутренний интерфейс

NAT_I="eth2" # Внешний интерфейс

FULL_CAPACITY="100mbit" # Общая пропускная способность внешнего канала

DEFAULT_L="4kbit" # Полоса для траффика по-умолчанию, на самом деле такого быть в общем-то не должно, так это это скорее заглушка такая себе

GARANTED="100mbit" # Полоса для гарантированного трафика, т.е. для бизнес-абонентов. Сейчас установлена в максимум, потому как не пока не работает

STANDARD="100mbit" # Выделенная полоса для обычных клиентов, установлена в максимум потому что пока не работает ограничение

STANDARD_CEIL="100mbit" # Дополнительный трафик для обычных клиентов, если есть - то отбирается свободных у бизнес-абонентов

LOW_SPEED="100mbit" # Полоса для клиентов, у которых действует "локальное ограничение", т.е. приоритетное ограничение

LOW_SPEED_CEIL="100mbit" # Дополнительная полоса для клиентов, у которых действует "локальное ограничение", т.е. приоритетное ограничение

 

UAIX=$STANDARD # Полоса для клиентов с ограничением скорости украинского трафика

UAIX_CEIL=$STANDARD_CEIL # Дополнительная полоса для клиентов с ограничением скорости украинского трафика

WORLD=$STANDARD # Полоса для клиентов с ограничением скорости мирового трафика

WORLD_CEIL=$STANDARD_CEIL # Дополнительная полоса для клиентов с ограничением скорости мирового трафика

 

# DELETE OLD QUEUES - удаляем все старые настройки

$TC qdisc del dev ifb0 root handle 1:

$TC qdisc del dev $NAT_I root handle 1:

$TC qdisc del dev $INT_I root handle 1:

 

 

# создаем корневую дисциплину для виртуального интерфейса с указанием дефолтного класса

$TC qdisc add dev ifb0 root handle 1: htb default 25

 

#

# Full interface capacity - создаем глобальное ограничение полосы в соответствии с данными внешнего канала

#

$TC class add dev ifb0 parent 1: classid 1:1 htb rate $FULL_CAPACITY ceil $FULL_CAPACITY burst 15k

$TC qdisc add dev ifb0 parent 1:1 handle 2: sfq limit 1024 perturb 15

 

# DEFAULT - скорость по-умолчанию, для всего неправильно типизированного траффика

$TC class add dev ifb0 parent 1:1 classid 1:25 htb rate $DEFAULT_L burst 1k

#$TC qdisc add dev ifb0 parent 1:25 handle 25: sfq perturb 10

 

# GARANTED SHELF - полоса для бизнес абонентов с гарантированными параметрами и повышенным приоритетом (на само деле здесь пока трафика нет)

$TC class add dev ifb0 parent 1:1 classid 1:30 htb rate $GARANTED ceil $GARANTED burst 15k prio 1

$TC qdisc add dev ifb0 parent 1:30 handle 30: sfq limit 128 perturb 15

 

# STANDART SHELF - полоса для обычных клиентов с ограничениями мира и украины (здесь сейчас практически весь трафик, эта полосам должна отбирать дополнительную часть у гарантированных абонентов, если есть недоиспользованный трафик)

$TC class add dev ifb0 parent 1:1 classid 1:35 htb rate $STANDARD ceil $STANDARD_CEIL burst 15k prio 2

$TC qdisc add dev ifb0 parent 1:35 handle 35: sfq limit 128 perturb 15

 

# LOW SPEED - полоса для обычных клиентов с приоритетными "локальными" ограничениями

$TC class add dev ifb0 parent 1:1 classid 1:20 htb rate $LOW_SPEED ceil $LOW_SPEED_CEIL burst 15k prio 3

$TC qdisc add dev ifb0 parent 1:20 handle 20: sfq limit 128 perturb 15

 

#

# All UAIX - сюда попадает весь трафик украины

#

$TC class add dev ifb0 parent 1:35 classid 1:45 htb rate $UAIX ceil $UAIX_CEIL burst 15k prio 3

$TC qdisc add dev ifb0 parent 1:45 handle 45: sfq limit 128 perturb 15

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 5 fw flowid 1:45 # UAIX OUT

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 6 fw flowid 1:45 # UAIX IN

 

 

#

# All WORLD - сюда попадает весь трафик мира

#

$TC class add dev ifb0 parent 1:35 classid 1:55 htb rate $WORLD ceil $WORLD_CEIL burst 15k prio 3

$TC qdisc add dev ifb0 parent 1:55 handle 55: sfq limit 128 perturb 15

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 1 fw flowid 1:55 # WORLD OUT

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 2 fw flowid 1:55 # WORLD IN

 

 

 

 

 

#

# Redirection to IFB0

#

 

# OUT to EXTERNAL - перенаправляем исходящий трафик мир и украина на виртуальный интерфейс шейпера

$TC qdisc add dev $NAT_I root handle 1: htb

$TC filter add dev $NAT_I parent 1: protocol all prio 1 handle 1 fw flowid 1: action mirred egress redirect dev ifb0 # WORLD

$TC filter add dev $NAT_I parent 1: protocol all prio 1 handle 5 fw flowid 1: action mirred egress redirect dev ifb0 # UAIX

 

# OUT to INTERNAL - перенаправляем входящий трафик мир и украина на виртуальный интерфейс шейпера

$TC qdisc add dev $INT_I root handle 1: htb

$TC filter add dev $INT_I parent 1: protocol all prio 1 handle 2 fw flowid 1: action mirred egress redirect dev ifb0 # WOLD

$TC filter add dev $INT_I parent 1: protocol all prio 1 handle 6 fw flowid 1: action mirred egress redirect dev ifb0 # UAIX

--------------------------------------------------------------------------------------------------------------------------------

 

 

Правила при добавлении клиента:

------------------------------------------------ Добавляем ограничение МИР=1Мб для клиента 10.10.10.5 ------------------

FPRIO="9"

CPRIO="5"

CPARENT ="1:55" - класс добавляем к полосе мира

FPARENT="1:55" - фильтр устанавливаем на уровне мирового подкласса

CLIENTNUM=34 - уникальный номер клиента, используется как индекс для управления списками

CLIENTIP=10.10.10.5 - адрес клиента, может быть несколько адресов - тогда последние две строчки повторяются для каждого из адресов клиента

$TC class add dev ifb0 parent $CPARENT classid 1:$CLIENTNUM htb rate 1mbit ceil 1mbit prio 5

$TC qdisc add dev ifb0 parent 1:$CLIENTNUM handle $CLIENTNUM: sfq perturb 10

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip src $CLIENTIP/32 flowid 1:$CLIENTNUM

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip dst $CLIENTIP/32 flowid 1:$CLIENTNUM

----------------------------------------------------------------------------------------------------------------------------------------------

 

 

------------------------------------------------ Добавляем ограничение УКРАИНА=5Мб для клиента 10.10.10.5 ------------

FPRIO="9"

CPRIO="5"

CPARENT ="1:45" - класс добавляем к полосе украины

FPARENT="1:45" - фильтр устанавливаем на уровне украинского подкласса

CLIENTNUM=34 - уникальный номер клиента, используется как индекс для управления списками

CLIENTIP=10.10.10.5 - адрес клиента, может быть несколько адресов - тогда последние две строчки повторяются для каждого из адресов клиента

$TC class add dev ifb0 parent $CPARENT classid 1:$CLIENTNUM htb rate 5mbit ceil 5mbit prio 5

$TC qdisc add dev ifb0 parent 1:$CLIENTNUM handle $CLIENTNUM: sfq perturb 10

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip src $CLIENTIP/32 flowid 1:$CLIENTNUM

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip dst $CLIENTIP/32 flowid 1:$CLIENTNUM

----------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

------------------------------------------------ Добавляем ограничение ОБЩЕЕ("локальное")=2Мб для клиента 10.10.10.10 ------------------

FPRIO="8"

CPRIO="6"

CPARENT ="1:20" - класс добавляем к полосе "локального" приоритетного ограничителя

FPARENT="1:" - фильтр устанавливаем на уровне корневого подкласса, тем самым устанавливая приоритет такого ограничения на украинским и мировым

CLIENTNUM=34 - уникальный номер клиента, используется как индекс для управления списками

CLIENTIP=10.10.10.10 - адрес клиента, может быть несколько адресов - тогда последние две строчки повторяются для каждого из адресов клиента

$TC class add dev ifb0 parent $CPARENT classid 1:$CLIENTNUM htb rate 2mbit ceil 2mbit prio 5

$TC qdisc add dev ifb0 parent 1:$CLIENTNUM handle $CLIENTNUM: sfq perturb 10

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip src $CLIENTIP/32 flowid 1:$CLIENTNUM

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip dst $CLIENTIP/32 flowid 1:$CLIENTNUM

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

Спасибо огромное!

Изменено пользователем telephonist

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У вас везде ceil=rate, на первый взгляд дело в этом

 

ceil должен быть > rate

тогда класс сможет занимать полосу у родительского, если там есть свободная.

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

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, дело не в этом. Вопрос основной вот каков:

 

Я остановился на моменте, когда не могу выделить гарантированную полосу для бизнес абонентов в целом. Для теста я ставил рядовым клиентам ограничение(общее для всех) к примеру 1Мб и ceil 1mbit - но клиенты все равно получали всю полосу... т.е. где-то закралась ошибка и мне пока так и не удалось ее найти.

 

Т.е. переменнаые:

STANDARD="100mbit" # Выделенная полоса для обычных клиентов, установлена в максимум потому что пока не работает ограничение

STANDARD_CEIL="100mbit" # Дополнительный трафик для обычных клиентов, если есть - то отбирается свободных у бизнес-абонентов

Были устоновлены в 1мбит

НО! Клиенты все равно кушали то, что им устанавливается в самом низу, хотя по идее они не должны были брать больше чем ограничение родительского класса. :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Киньте сюда визуалицию как оно работает при отборе полосы физиком и юриком.

Действительно много букв для восприятия.

 

Вот скрипт под это дело http://stat.oborona.net/tc_viewer.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Киньте сюда визуалицию как оно работает при отборе полосы физиком и юриком.

Действительно много букв для восприятия.

 

Вот скрипт под это дело http://stat.oborona.net/tc_viewer.txt

Смотрите скриншот.

 

Визуализация (только здесь стоят не те значения которые описаны выше, но основной вопрос остается прежним - почему, когда я в головном скрипте иннициализации шейпера меняю STANDARD и STANDARD_CEIL к примеру на 1mbit - клиенты все равно кушают столько трафика, сколько им назначено, хотя должны не иметь возможности брать больше чем у родительского класса 1:35? )

Sun Oct 24 15:31:59 2010

 

Mode: HTB ^C to QUIT

 

 

^[[2K 1:1 < 400000Kbit - 400000Kbit > 98260.5 kbit/s (14663pps)

^[[2K 1:20 < 400000Kbit - 400000Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:a003 < 2048Kbit - 2048Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:a005 < 14336Kbit - 14336Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:a007 < 1000bit - 1000bit > 0.0 kbit/s ( 0pps)

^[[2K 1:a076 < 1024Kbit - 1024Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:25 < 4000bit - 4000bit > 0.0 kbit/s ( 0pps)

^[[2K 1:30 < 400000Kbit - 400000Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:35 < 400000Kbit - 400000Kbit > 98260.5 kbit/s (14663pps)

^[[2K 1:45 < 400000Kbit - 400000Kbit > 57074.7 kbit/s (7234pps)

^[[2K 1:b000 < 75000Kbit - 75000Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:b001 < 50000Kbit - 50000Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:b002 < 6144Kbit - 6144Kbit > 2.6 kbit/s ( 3pps)

^[[2K 1:b003 < 25600Kbit - 25600Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:b004 < 4096Kbit - 4096Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:b005 < 10240Kbit - 10240Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:b006 < 6144Kbit - 6144Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:b007 < 6144Kbit - 6144Kbit > 0.0 kbit/s ( 0pps)

........................

^[[2K 1:55 < 400000Kbit - 400000Kbit > 41156.0 kbit/s (7423pps)

^[[2K 1:c000 < 6144Kbit - 6144Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:c001 < 5120Kbit - 5120Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:c002 < 1024Kbit - 1024Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:c003 < 3072Kbit - 3072Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:c004 < 512000bit - 512000bit > 0.0 kbit/s ( 0pps)

^[[2K 1:c005 < 3072Kbit - 3072Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:c006 < 1024Kbit - 1024Kbit > 0.0 kbit/s ( 0pps)

^[[2K 1:c007 < 1024Kbit - 1024Kbit > 0.0 kbit/s ( 0pps)

.................................

 

Спасибо огромное!

 

PS Что-то отступы страдают. Подчиненность классов такая:

1:1 - > 1:20 -> 1:aXXX

1:1 - > 1:25

1:1 -> 1:30

1:1 -> 1:35 -> 1:45 -> 1:bXXX

1:1 -> 1:35 -> 1:55 -> 1:cXXX

post-68119-1288006069_thumb.png

Изменено пользователем telephonist

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

как вам уже говорили - у вас абсолютно всюду rate=ceil

шейпер работает именно так, как вы ему сказали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, я сделал ceil больше rate. Посмотрите на картинку пожалуйста. Несмотря на та что у класса 1:35 стоит rate 1mbit ceil 2mbit - все подчиненные классы(пользовательские) в сумме кушают около 26mbit на данном скриншоте. Т.е. каждый клиент получае то, что прописано ему ниже, а в сумме выходят за пределы ограничений родительского класса. Почему так происходит? :(

post-68119-1288260235_thumb.png

 

PS Прошу не обращать внимания на некоторые изменения в отличае от первого поста - я переместил класс 1:35 в подчинение к 1:20. Но для конкретного вопроса это не имеет значения.

Изменено пользователем telephonist

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коллеги, я сделал ceil больше rate. Посмотрите на картинку пожалуйста. Несмотря на та что у класса 1:35 стоит rate 1mbit ceil 2mbit - все подчиненные классы(пользовательские) в сумме кушают около 26mbit на данном скриншоте. Т.е. каждый клиент получае то, что прописано ему ниже, а в сумме выходят за пределы ограничений родительского класса. Почему так происходит? :(

Наверное потому, что у Вас сумма рейтов подчиненных классов больше чем рейт родительского.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Коллеги, я сделал ceil больше rate. Посмотрите на картинку пожалуйста. Несмотря на та что у класса 1:35 стоит rate 1mbit ceil 2mbit - все подчиненные классы(пользовательские) в сумме кушают около 26mbit на данном скриншоте. Т.е. каждый клиент получае то, что прописано ему ниже, а в сумме выходят за пределы ограничений родительского класса. Почему так происходит? :(
Наверное потому, что у Вас сумма рейтов подчиненных классов больше чем рейт родительского.

Спасибо, только.... Это выглядит нелогично. Тогда бы небыло никакого смысла строить иерархическую структуру, если родительские установки не ограничивают подчиненные. Вы уверены, что именно в этом причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо, только.... Это выглядит нелогично. Тогда бы небыло никакого смысла строить иерархическую структуру, если родительские установки не ограничивают подчиненные. Вы уверены, что именно в этом причина?
Ну вообще то в документации написано что сумма рейтов дочерних классов не должна быть более рейта родителя. Как в прочем и цейл потомка не может быть больше цейла родителя.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Наверное потому, что у Вас сумма рейтов подчиненных классов больше чем рейт родительского.

Спасибо, только.... Это выглядит нелогично. Тогда бы небыло никакого смысла строить иерархическую структуру, если родительские установки не ограничивают подчиненные. Вы уверены, что именно в этом причина?

Если иначе сформулировать, то попадание текущей полосы класса в указанный rate - это сигнал для HTB к пропуску этого трафика, и выше по иерархии классов он при этом не движется. Поскольку у вас rate=ceil, то трафик класса всегда попадает в rate, и никакие rate/ceil указаные в родительских классах уже ничего не значат.

 

Ставьте у всех юзеров rate = 1bit/s, так они будут получать излишек полосы в равных пропорциях и сумма rate точно не превысит rate родительского класса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Скорее так: полоса пропускания _одного_ дочернего класса не может быть больше, чем полоса пропускания родительского класса. Дочерних очередей можно насоздавать сколько угодно, вопрос лишь в том, что не все из них одновременно могут быть обслужены. Практически у всех успешных провайдеров сумма юзерских полос пропускания в несколько раз превышает полосу аплинка. Весь этот (нае)бизнес держится на низкой вероятности того, что все начнут пользоваться Интернетом одновременно и загружать канал на 100%.

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

и одного и всех. иначе с точки зрения шейпера задача превращается в совершенно другую. нельзя ставить rate дочерних классов таковым, чтобы их сумма превышала rate а тем более ceil родительского. об этом четко и не двусмысленно сказано в мане, и даже описано что будет если сделать так. так вот у telephonist'а именно это и происходит.

 

как уже писалось выше - если rate родительского класса 1 мибт, то если у вас даже теоретически может одновременно работать 100 человек - то вам необходимо выставить rate каждому 1 кбит. а ceil ставьте какой хотите. и будет у вас все хорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас