Рапределение трафика

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

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

zkrvova
Сообщения: 280

Рапределение трафика

Сообщение zkrvova »

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

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

Re: Рапределение трафика

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

а можно увидеть скрипты/настройки? ;)
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
zkrvova
Сообщения: 280

Re: Рапределение трафика

Сообщение zkrvova »

Olden Gremlin писал(а):
01.02.2007 19:21
а можно увидеть скрипты/настройки? ;)


Пожалуйста:

DEVICE=eth0
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
RULE=X.X.X.X
RULE=X.X.X.X
RULE=X.X.X.X
RULE=X.X.X.X
Спасибо сказали:
Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: Рапределение трафика

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

zkrvova писал(а):
01.02.2007 21:22
Пожалуйста:
DEVICE=eth0
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
RULE=X.X.X.X
RULE=X.X.X.X
RULE=X.X.X.X
RULE=X.X.X.X
Хм... Нда-с...
Вопрос не совсем в тему - а нарисовать саомстоятельно правила для tc и использовать не cbq, а htb религия мешает? :(
Ладно, не стоит воспринимать все очень близко к сердцу... Продолжаем "рекламную акцию" в поддержку замечательного продукта tcng :)
Для начала немного отвлечемся от непосредственной темы и сравним врпавила для двух дисциплин cbq и htb:

Код: Выделить всё

#include "fields.tc"
#include "ports.tc"

#define INTERFACE100  etc0
#define INTERFACE200  etc1
#define RATE 960kbps
#define CEIL 1024kbps
#define BANDWIDTH 100Mbps

dev INTERFACE100 {
        egress {
                class ( <$other> )  if 1;
                htb () {
                        class ( rate RATE, ceil CEIL ) {
                                $other = class ( rate RATE, ceil CEIL ) { sfq; };
                        }
                }
        }
}

dev INTERFACE200 {
        egress {
                class ( <$other> )  if 1;
                cbq ( bandwidth BANDWIDTH, avpkt 1000Bytes, maxburst 20pcks, allot 1514Bytes ) {
                        class ( rate RATE ) {
                                $other = class ( rate RATE ) { sfq; };
                        }
                }
        }
}
Осознав, что всетаки ничего страшного в использовании htb нет начнем рыть в его сторону. Никто не против? Тогда поехали.
Предположим, что у нас есть адреса 192.168.0.100, 192.168.0.102, 192.168.0.103 и 192.168.0.104 которым мы больше 128kbit/s отдавать не хотим и есть наш адрес 192.168.0.101, а себе мы, что вполне естественно, выделяем полосу пошире, скажем 512kbit/s. все остальные в сети 192.168.0.0/24 сосут лапу на 32kbit/s. Получаем следующий скрипт для tcng:

Код: Выделить всё

#include "fields.tc"
#include "ports.tc"

#define INTERFACE0              eth0

#define SELF_IPADDR             192.168.0.1
#define SELF_RATE               92Mbps
#define SELF_CEIL               100Mbps

#define ADMIN_RATE              460kbps
#define ADMIN_CEIL              512kbps
#define ADMIN_IP101             192.168.0.101

#define USER_RATE               92kbps
#define USER_CEIL               128kbps
#define USER_IP100              192.168.0.100
#define USER_IP102              192.168.0.102
#define USER_IP103              192.168.0.103
#define USER_IP104              192.168.0.104

#define OTHER_IPNET             192.168.0.0
#define OTHER_RATE              29kbps
#define OTHER_CEIL              32kbps

dev INTERFACE0 {
        egress {
                class ( <$self> ) if
                        ip_src == SELF_IPADDR || ip_dst == SELF_IPADDR;
                class ( <$admin> ) if
                        ip_src == ADMIN_IP101 || ip_dst == ADMIN_IP101;
                class ( <$user> ) if
                        ( ip_src == USER_IP100 || ip_dst == USER_IP100 ) ||
                        ( ip_src == USER_IP102 || ip_dst == USER_IP102 ) ||
                        ( ip_src == USER_IP103 || ip_dst == USER_IP103 ) ||
                        ( ip_src == USER_IP104 || ip_dst == USER_IP104 );
                class ( <$other> ) if
                        ( ip_src/24 == OTHER_IPNET || ip_dst/24 == OTHER_IPNET );
                drop if 1;
                htb () {
                        class ( rate SELF_RATE, ceil SELF_CEIL ) {
                                $self = class ( rate SELF_RATE, ceil SELF_CEIL ) { sfq ( perturb 10s ); }
                                $admin = class ( rate ADMIN_RATE, ceil ADMIN_CEIL ) { sfq ( perturb 10s ); }
                                $user = class ( rate USER_RATE, ceil USER_CEIL ) { sfq ( perturb 10s ); }
                                $other = class ( rate OTHER_RATE, ceil OTHER_CEIL ) { sfq ( perturb 10s ); }
                        }
                }
        }
}
Достаточно прозрачные правила?
После компиляции через tcng получаем следующий набор команд для tc:

Код: Выделить всё

$ tcng ./sample2.tc

# ================================ Device eth0 ================================

tc qdisc add dev eth0 handle 1:0 root dsmark indices 8 default_index 0
tc qdisc add dev eth0 handle 2:0 parent 1:0 htb
tc class add dev eth0 parent 2:0 classid 2:1 htb rate 11500000bps ceil 12500000bps
tc class add dev eth0 parent 2:1 classid 2:2 htb rate 11500000bps ceil 12500000bps
tc qdisc add dev eth0 handle 3:0 parent 2:2 sfq perturb 10
tc class add dev eth0 parent 2:1 classid 2:3 htb rate 57500bps ceil 64000bps
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 11500bps ceil 16000bps
tc qdisc add dev eth0 handle 5:0 parent 2:4 sfq perturb 10
tc class add dev eth0 parent 2:1 classid 2:5 htb rate 3625bps ceil 4000bps
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:5
tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:4
tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:3
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 u32 match u32 0xc0a80001 0xffffffff at 12 classid 1:1
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80001 0xffffffff at 16 classid 1:1
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80065 0xffffffff at 12 classid 1:2
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80065 0xffffffff at 16 classid 1:2
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80064 0xffffffff at 12 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80064 0xffffffff at 16 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80066 0xffffffff at 12 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80066 0xffffffff at 16 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80067 0xffffffff at 12 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80067 0xffffffff at 16 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80068 0xffffffff at 12 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80068 0xffffffff at 16 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffff00 at 12 classid 1:4
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffff00 at 16 classid 1:4
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:0 police index 1 rate 1bps burst 1 action drop/drop
Послудний drop/drop можно свести к присто drop.
Если уж настолько критично использование именно cbq, то основываясь на первом скрипте вносим несложные изменения во второй скрипт. Но это уже задание для самостоятельной работы... ;)
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
zkrvova
Сообщения: 280

Re: Рапределение трафика

Сообщение zkrvova »

Попробую конечно htb. Я его никогда не пробовал.
Но вопрос, а чем применение htb лучше чем cbq?

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

Re: Рапределение трафика

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

zkrvova писал(а):
05.02.2007 12:55
И ещё вопрос, в данных скриптах распределения полосы происходит быстро?

что означает "быстро"?
не медленнее чем через описанные правила для shaper.
в итоге все равно формируются правила для tc.

zkrvova писал(а):
05.02.2007 12:55
Но вопрос, а чем применение htb лучше чем cbq?

http://www.opennet.ru/docs/RUS/adv_route_qos/
Существует два широко используемых Classfull Qdisks.

Первый, весьма сложный в своей семантике, но поэтому гибкий - CBQ (Class Based Queue). Эта дисциплина была разработана одной из первых, и на ее основе строятся все наиболее популярные схемы распределения трафика. Она позволяет выполнять все возможные манипуляции по построению классов, приоритезации трафика и его ограничения. При разделении полосы с помощью шейперов, например TBF или SFQ, возможно наследование свободного канала как вниз по дереву классов, так и вверх. CBQ позволяет приоритезировать трафик наподобие PRIO qdisk. При разделении канала на полосы, дисциплина работает в целом относительно точно, так как использует его временные характеристики. Но не всегда точно в рамках отдельного класса. Основной рекомендацией при использовании CBQ является то, что надо следить, чтобы сумма полос нижележащих классов была меньше или равна каналу родительского класса. Из этого правила могут быть исключения, например если ваш канал никогда полностью не загружен по всем классам (когда трафик минимален). Но в любом случае описание структуры CBQ начинается с указания точной максимальной полосы пропускания вашего канала. Что не всегда известно. Сложность при использовании CBQ заключается в его не простом синтаксисе, а так-же довольно не интуитивной системе построения классов в целом.

Второй Classfull Qdisk - HTB (Hierachical Token Bucket). Эта дисциплина появилась в официальном ядре начиная с версии 2.4.20. Алгоритм ее работы во многом схож с TBF и CBQ одновременно. HTB отличает такая-же гибкость, как у CBQ, но в отличие от последнего, HTB гораздо более интуитивно понятен, имеет упрощенную конфигурацию, более точен в механизмах шейпинга. Кроме того, для HTB не нужно описывать пропускную способность всего канала.
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
zkrvova
Сообщения: 280

Re: Рапределение трафика

Сообщение zkrvova »

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

Re: Рапределение трафика

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

zkrvova писал(а):
05.02.2007 14:43
Тогда вопрос о быстрой балансировке канала остаётся открытым?

Берем на заметку следующий тезис:
Чем больше prio в классе, тем ниже приоритет при наследовании полосы. Допустимый диапазон - 0-7.

Вносим соответствующие изменения в вышеприведенный скрипт:

Код: Выделить всё

#include "fields.tc"
#include "ports.tc"

/* Параметр R2Q используется для квантования трафика в классах. В случае
малых скоростей рекомендуется значение = 1, что позволяет шейпать с
точностью до 4kbit. Если не указан, то =10, что для скоростей >120Kbit */
#define R2Q                             1

/* Чем больше prio в классе, тем ниже приоритет при наследовании полосы.
Допустимый диапазон - 0-7. */
#define PRIO_1                  0       /* высокий приоритет */
#define PRIO_4                  4
#define PRIO_7                  7       /* низкий приоритет */

#define INTERFACE0              eth0

#define SELF_IPADDR             192.168.0.1
#define SELF_RATE               92Mbps
#define SELF_CEIL               100Mbps

#define ADMIN_RATE              460kbps
#define ADMIN_CEIL              512kbps
#define ADMIN_IP101             192.168.0.101

#define USER_RATE               92kbps
#define USER_CEIL               128kbps
#define USER_IP100              192.168.0.100
#define USER_IP102              192.168.0.102
#define USER_IP103              192.168.0.103
#define USER_IP104              192.168.0.104

#define OTHER_IPNET             192.168.0.0
#define OTHER_RATE              29kbps
#define OTHER_CEIL              32kbps

dev INTERFACE0 {
        egress {
                class ( <$self> ) if
                        ip_src == SELF_IPADDR || ip_dst == SELF_IPADDR;
                class ( <$admin> ) if
                        ip_src == ADMIN_IP101 || ip_dst == ADMIN_IP101;
                class ( <$user1> ) if
                        ( ip_src == USER_IP100 || ip_dst == USER_IP100 ) ||
                        ( ip_src == USER_IP104 || ip_dst == USER_IP104 );
                class ( <$user7> ) if
                        ( ip_src == USER_IP102 || ip_dst == USER_IP102 ) ||
                        ( ip_src == USER_IP103 || ip_dst == USER_IP103 );
                class ( <$other> ) if
                        ( ip_src/24 == OTHER_IPNET || ip_dst/24 == OTHER_IPNET );
                drop if 1;
                htb ( r2q R2Q ) {
                        class ( rate SELF_RATE, ceil SELF_CEIL ) {
                                $self  = class ( rate SELF_RATE, ceil SELF_CEIL, prio PRIO_1 ) { sfq ( perturb 10s ); }
                                $admin = class ( rate ADMIN_RATE, ceil ADMIN_CEIL, prio PRIO_1 ) { sfq ( perturb 10s ); }
                                $user1 = class ( rate USER_RATE, ceil USER_CEIL, prio PRIO_1 ) { sfq ( perturb 10s ); }
                                $user7 = class ( rate USER_RATE, ceil USER_CEIL, prio PRIO_7 ) { sfq ( perturb 10s ); }
                                $other = class ( rate OTHER_RATE, ceil OTHER_CEIL, prio PRIO_4 ) { sfq ( perturb 10s ); }
                        }
                }
        }
}
Получаем вывод:

Код: Выделить всё

# ================================ Device eth0 ================================

tc qdisc add dev eth0 handle 1:0 root dsmark indices 8 default_index 0
tc qdisc add dev eth0 handle 2:0 parent 1:0 htb r2q 1
tc class add dev eth0 parent 2:0 classid 2:1 htb rate 11500000bps ceil 12500000bps
tc class add dev eth0 parent 2:1 classid 2:2 htb rate 11500000bps ceil 12500000bps prio 0
tc qdisc add dev eth0 handle 3:0 parent 2:2 sfq perturb 10
tc class add dev eth0 parent 2:1 classid 2:3 htb rate 57500bps ceil 64000bps prio 0
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 11500bps ceil 16000bps prio 0
tc qdisc add dev eth0 handle 5:0 parent 2:4 sfq perturb 10
tc class add dev eth0 parent 2:1 classid 2:5 htb rate 11500bps ceil 16000bps prio 7
tc qdisc add dev eth0 handle 6:0 parent 2:5 sfq perturb 10
tc class add dev eth0 parent 2:1 classid 2:6 htb rate 3625bps ceil 4000bps prio 4
tc qdisc add dev eth0 handle 7:0 parent 2:6 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 5 tcindex classid 2:6
tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 4 tcindex classid 2:5
tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 3 tcindex classid 2:4
tc filter add dev eth0 parent 2:0 protocol all prio 1 handle 2 tcindex classid 2:3
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 u32 match u32 0xc0a80001 0xffffffff at 12 classid 1:1
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80001 0xffffffff at 16 classid 1:1
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80065 0xffffffff at 12 classid 1:2
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80065 0xffffffff at 16 classid 1:2
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80064 0xffffffff at 12 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80064 0xffffffff at 16 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80068 0xffffffff at 12 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80068 0xffffffff at 16 classid 1:3
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80066 0xffffffff at 12 classid 1:4
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80066 0xffffffff at 16 classid 1:4
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80067 0xffffffff at 12 classid 1:4
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80067 0xffffffff at 16 classid 1:4
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffff00 at 12 classid 1:5
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0xc0a80000 0xffffff00 at 16 classid 1:5
tc filter add dev eth0 parent 1:0 protocol all prio 1 u32 match u32 0x0 0x0 at 0 classid 1:0 police index 1 rate 1bps burst 1 action drop/drop
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
zkrvova
Сообщения: 280

Re: Рапределение трафика

Сообщение zkrvova »

Чегото я непонял. Сдесь описана балансировка по приоритетам?

Но мне нужно чтоб у всех был одинаковый приоритет. Но пользователи занимали свою чать общей полосы быстрее.

И ещё былобы неплохо серфингистам иметь больший приоритете чем у качов. Но в разное время они могут меняться местами.
Спасибо сказали:
Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: Рапределение трафика

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

zkrvova писал(а):
05.02.2007 17:13
Чегото я непонял. Сдесь описана балансировка по приоритетам?
Хм... Хотелось бы четкое определение, что подразумевается в данном вопросе под баллансировкой?

zkrvova писал(а):
05.02.2007 17:13
Но мне нужно чтоб у всех был одинаковый приоритет. Но пользователи занимали свою чать общей полосы быстрее.
Только честно Advanced Routing и QoS ссылку на который я привел выше - читался?
В случае, если предположить, что все классы будут забиты трафиком (почти невероятно), то никто не получит свой CIR, но будет очень близок к нему тот класс, у которого выше prio и больше quantum.


zkrvova писал(а):
05.02.2007 17:13
И ещё былобы неплохо серфингистам иметь больший приоритете чем у качов. Но в разное время они могут меняться местами.
А еще RFC-2324 уметь реализовывать... :(
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали:
Аватара пользователя
Olden Gremlin
Сообщения: 365
Статус: RAP22-RIPE
ОС: Debian GNU/Linux Wheezy

Re: Рапределение трафика

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

Вдогонку... Погуглил немного... Совсем немного...
NAT + shaper = iptables

Ну и конечно-же неплохо заглянуть в Linux Advanced Routing & Traffic Control HOWTO а именно главу Пример подключения локальной сети к Интернет через NAT, с организацией QoS.
«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
Спасибо сказали: