telephonist Опубликовано 15 октября, 2010 (изменено) · Жалоба ВНИМАНИЕ МНОГО БУКАФФ, НО ИНАЧЕ НЕЛЬЗЯ Задача состоит в том, чтобы сделать гарантированную полосу для некоторых клиентов, но если она не занята отдавать её под всех остальных. Я очень надеюсь, что объяснил достаточно подробно и понятно, что есть сейчас, прошу вас помочь решить поставленную задачу. ПО крайней мере у меня сейчас вопрос пока один основной - почему, когда я в головном скрипте иннициализации шейпера меняю 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 --------------------------------------------------------------------------------------------------------------------------------------------------------------------- Спасибо огромное! Изменено 15 октября, 2010 пользователем telephonist Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
packetizer Опубликовано 15 октября, 2010 · Жалоба У вас везде ceil=rate, на первый взгляд дело в этом ceil должен быть > rate тогда класс сможет занимать полосу у родительского, если там есть свободная. Дочерний класс будет пытаться передавать данные на скорости ceil , насколько он агрессивно будет занимать занимать зависит от quantum. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telephonist Опубликовано 15 октября, 2010 · Жалоба Нет, дело не в этом. Вопрос основной вот каков: Я остановился на моменте, когда не могу выделить гарантированную полосу для бизнес абонентов в целом. Для теста я ставил рядовым клиентам ограничение(общее для всех) к примеру 1Мб и ceil 1mbit - но клиенты все равно получали всю полосу... т.е. где-то закралась ошибка и мне пока так и не удалось ее найти. Т.е. переменнаые: STANDARD="100mbit" # Выделенная полоса для обычных клиентов, установлена в максимум потому что пока не работает ограничение STANDARD_CEIL="100mbit" # Дополнительный трафик для обычных клиентов, если есть - то отбирается свободных у бизнес-абонентов Были устоновлены в 1мбит НО! Клиенты все равно кушали то, что им устанавливается в самом низу, хотя по идее они не должны были брать больше чем ограничение родительского класса. :( Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 17 октября, 2010 · Жалоба Киньте сюда визуалицию как оно работает при отборе полосы физиком и юриком. Действительно много букв для восприятия. Вот скрипт под это дело http://stat.oborona.net/tc_viewer.txt Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telephonist Опубликовано 24 октября, 2010 (изменено) · Жалоба Киньте сюда визуалицию как оно работает при отборе полосы физиком и юриком.Действительно много букв для восприятия. Вот скрипт под это дело 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 Изменено 25 октября, 2010 пользователем telephonist Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Nallien Опубликовано 27 октября, 2010 · Жалоба как вам уже говорили - у вас абсолютно всюду rate=ceil шейпер работает именно так, как вы ему сказали. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telephonist Опубликовано 28 октября, 2010 (изменено) · Жалоба Коллеги, я сделал ceil больше rate. Посмотрите на картинку пожалуйста. Несмотря на та что у класса 1:35 стоит rate 1mbit ceil 2mbit - все подчиненные классы(пользовательские) в сумме кушают около 26mbit на данном скриншоте. Т.е. каждый клиент получае то, что прописано ему ниже, а в сумме выходят за пределы ограничений родительского класса. Почему так происходит? :( PS Прошу не обращать внимания на некоторые изменения в отличае от первого поста - я переместил класс 1:35 в подчинение к 1:20. Но для конкретного вопроса это не имеет значения. Изменено 28 октября, 2010 пользователем telephonist Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Jugernault Опубликовано 28 октября, 2010 · Жалоба Коллеги, я сделал ceil больше rate. Посмотрите на картинку пожалуйста. Несмотря на та что у класса 1:35 стоит rate 1mbit ceil 2mbit - все подчиненные классы(пользовательские) в сумме кушают около 26mbit на данном скриншоте. Т.е. каждый клиент получае то, что прописано ему ниже, а в сумме выходят за пределы ограничений родительского класса. Почему так происходит? :( Наверное потому, что у Вас сумма рейтов подчиненных классов больше чем рейт родительского. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
telephonist Опубликовано 28 октября, 2010 · Жалоба Коллеги, я сделал ceil больше rate. Посмотрите на картинку пожалуйста. Несмотря на та что у класса 1:35 стоит rate 1mbit ceil 2mbit - все подчиненные классы(пользовательские) в сумме кушают около 26mbit на данном скриншоте. Т.е. каждый клиент получае то, что прописано ему ниже, а в сумме выходят за пределы ограничений родительского класса. Почему так происходит? :(Наверное потому, что у Вас сумма рейтов подчиненных классов больше чем рейт родительского. Спасибо, только.... Это выглядит нелогично. Тогда бы небыло никакого смысла строить иерархическую структуру, если родительские установки не ограничивают подчиненные. Вы уверены, что именно в этом причина? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Jugernault Опубликовано 28 октября, 2010 · Жалоба Спасибо, только.... Это выглядит нелогично. Тогда бы небыло никакого смысла строить иерархическую структуру, если родительские установки не ограничивают подчиненные. Вы уверены, что именно в этом причина?Ну вообще то в документации написано что сумма рейтов дочерних классов не должна быть более рейта родителя. Как в прочем и цейл потомка не может быть больше цейла родителя. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Алексей Андриянов Опубликовано 29 октября, 2010 · Жалоба Наверное потому, что у Вас сумма рейтов подчиненных классов больше чем рейт родительского. Спасибо, только.... Это выглядит нелогично. Тогда бы небыло никакого смысла строить иерархическую структуру, если родительские установки не ограничивают подчиненные. Вы уверены, что именно в этом причина? Если иначе сформулировать, то попадание текущей полосы класса в указанный rate - это сигнал для HTB к пропуску этого трафика, и выше по иерархии классов он при этом не движется. Поскольку у вас rate=ceil, то трафик класса всегда попадает в rate, и никакие rate/ceil указаные в родительских классах уже ничего не значат. Ставьте у всех юзеров rate = 1bit/s, так они будут получать излишек полосы в равных пропорциях и сумма rate точно не превысит rate родительского класса. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 30 октября, 2010 (изменено) · Жалоба Скорее так: полоса пропускания _одного_ дочернего класса не может быть больше, чем полоса пропускания родительского класса. Дочерних очередей можно насоздавать сколько угодно, вопрос лишь в том, что не все из них одновременно могут быть обслужены. Практически у всех успешных провайдеров сумма юзерских полос пропускания в несколько раз превышает полосу аплинка. Весь этот (нае)бизнес держится на низкой вероятности того, что все начнут пользоваться Интернетом одновременно и загружать канал на 100%. Изменено 30 октября, 2010 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Nallien Опубликовано 31 октября, 2010 · Жалоба и одного и всех. иначе с точки зрения шейпера задача превращается в совершенно другую. нельзя ставить rate дочерних классов таковым, чтобы их сумма превышала rate а тем более ceil родительского. об этом четко и не двусмысленно сказано в мане, и даже описано что будет если сделать так. так вот у telephonist'а именно это и происходит. как уже писалось выше - если rate родительского класса 1 мибт, то если у вас даже теоретически может одновременно работать 100 человек - то вам необходимо выставить rate каждому 1 кбит. а ceil ставьте какой хотите. и будет у вас все хорошо. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...