Такая проблема. С помощью Cbq веделяю нескольким пользователям канал определённой ширины. По идее канал должен делится между юзерами. Но в случае если ктото начинает качать большой файл и занимает весь канал, то тот кто подключается позже получает занятый канал который перераспределится между ними только через какоето время если второй тоже будет чтото качать. Ну а если он будет заниматся серфингом то это полные тормоза.
Вот вопрос как можно ускорить равномерное распределение канала или как понизить приоритет для качков и повысить для серфингистов?
Заранее благодарен.
Рапределение трафика
Модераторы: SLEDopit, Модераторы разделов
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: Рапределение трафика
а можно увидеть скрипты/настройки? 

«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
-
- Сообщения: 280
Re: Рапределение трафика
Пожалуйста:
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
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: Рапределение трафика
Хм... Нда-с...
Вопрос не совсем в тему - а нарисовать саомстоятельно правила для 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; };
}
}
}
}
Предположим, что у нас есть адреса 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
Если уж настолько критично использование именно cbq, то основываясь на первом скрипте вносим несложные изменения во второй скрипт. Но это уже задание для самостоятельной работы...

«Когда у общества нет цветовой дифференциации штанов — то нет цели!»
nic-hdl: RAP22-RIPE
-
- Сообщения: 280
Re: Рапределение трафика
Попробую конечно htb. Я его никогда не пробовал.
Но вопрос, а чем применение htb лучше чем cbq?
И ещё вопрос, в данных скриптах распределения полосы происходит быстро?
Но вопрос, а чем применение htb лучше чем cbq?
И ещё вопрос, в данных скриптах распределения полосы происходит быстро?
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: Рапределение трафика
что означает "быстро"?
не медленнее чем через описанные правила для shaper.
в итоге все равно формируются правила для tc.
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
-
- Сообщения: 280
Re: Рапределение трафика
Тогда вопрос о быстрой балансировке канала остаётся открытым?
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: Рапределение трафика
Берем на заметку следующий тезис:
Чем больше 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
-
- Сообщения: 280
Re: Рапределение трафика
Чегото я непонял. Сдесь описана балансировка по приоритетам?
Но мне нужно чтоб у всех был одинаковый приоритет. Но пользователи занимали свою чать общей полосы быстрее.
И ещё былобы неплохо серфингистам иметь больший приоритете чем у качов. Но в разное время они могут меняться местами.
Но мне нужно чтоб у всех был одинаковый приоритет. Но пользователи занимали свою чать общей полосы быстрее.
И ещё былобы неплохо серфингистам иметь больший приоритете чем у качов. Но в разное время они могут меняться местами.
-
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: Рапределение трафика
Хм... Хотелось бы четкое определение, что подразумевается в данном вопросе под баллансировкой?
Только честно Advanced Routing и QoS ссылку на который я привел выше - читался?
В случае, если предположить, что все классы будут забиты трафиком (почти невероятно), то никто не получит свой CIR, но будет очень близок к нему тот класс, у которого выше prio и больше quantum.
А еще RFC-2324 уметь реализовывать...

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