Есть канал, скажем 512 Кбит/с
И есть 3 небольшие группы клиентов: лимитчики, качки и геймеры.
Для качков надо где то 100 гигов в месяц
Для лимитчиков и геймеров 3 гига достаточно.
Идея такая:
Для геймеров сделать максимальный приоритет.
Для лимитчиков приоритет чуть ниже,
Для качков самый низкий
И еще.
хочется для безлимитчиков сделать максимальный приоритет для серфа, а для закачек пониже.
т.е. если кому то вздумается походить по страничкам, то под эти нужды выделялось бы скажем процентов 80 максимально возможной скорости в этот момент.
Есть идеи?
Динамическое ограничение скорости (чтоб по максимуму использовать ширину канала)
Модераторы: SLEDopit, Модераторы разделов
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: Динамическое ограничение скорости
QoS.
Настраивается через тот же tc(prio).
Настраивается через тот же tc(prio).
-
zkrvova
- Сообщения: 280
Re: Динамическое ограничение скорости
Я например незнаю как это реализовать.
Потому что:
пока никто не будет серфить то весь канал забьют закачки, но если ктото начнёт серфить то пока произойдёт перераспределение скорости то будет казаться что инет медленный. А так как каждый файл на странице открывается своим потоком то тут совсем будент плохо, т.к. перераспредлеляться будет всё медленно.
-
10puu
- Сообщения: 20
Re: Динамическое ограничение скорости
А если сквидом ограничить количество потоков?
-
Olden Gremlin
- Сообщения: 365
- Статус: RAP22-RIPE
- ОС: Debian GNU/Linux Wheezy
Re: Динамическое ограничение скорости
посмею предложить, как вариант в сторону "копать отсюда и до обеда", следующий вариант.
рисуем скрипт tcng:транслируем его в команды tc:
справедливый вопрос: и че мы тут собственно сделали?
для внешнего интерфейса (смотрит в интернет) нарисовали...
во первых нарисовали счетчик трафика в разрезе trTCM;
потом сказали о том, что трафик на порты 80 и 443 (http и https) - определен по классу $high;
трафик с адресов нашей сети (сеть с реальными ip - так что это надо учитывать) - то-же в класс $high;
icmp - то-же можно особо не ограничивать, его вообще пустим в fifo;
не, а дальше по-счетчикам, в зеленой полосе пускаем все в класс $medium, который работает практически как и $high, в желтой полосе - резка урезаем потребности пользователей, ну и красную полосу - просто рубим на корню.
в резуьтате имеем HTTP и HTTPS трафик в наивысшем приоритете, а все остальные протоколы - курят на общих основаниях.
но! это еще половина дела. это были правила для egress внешнего интерфейса, теперь нарисуем что-то подобное для внутреннего интерфейса (ну не умеет linux делать нормальный rate-limit, вот и приходится изголяться "симметричными" правилами):ну и переведем это в синтаксис tc:
собственно что делается в этих правилах - разбираемч по аналогии.
в принципе они симетричны первым, но есть один момент.
на сеть 192.168.0.0/27 трафик даже в зеленой полосе огрничивается классом $low (это так... для примера).
собственно, все...
лопату дал - дальше копаем самостоятельно!
рисуем скрипт 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Код:
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Код:
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: Динамическое ограничение скорости
Порылся прилично.
Мои рассуждения.
Вероятно я где то ошибаюсь. На практике пока не применял. Как канал заработает начну тестить. Хочется удовлетворительных результатов.
В первую очередь меня заботят лимитчики, потом геймеры, а качкам как повезет.
сначала схема:
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...
Мои рассуждения.
Вероятно я где то ошибаюсь. На практике пока не применял. Как канал заработает начну тестить. Хочется удовлетворительных результатов.
В первую очередь меня заботят лимитчики, потом геймеры, а качкам как повезет.
сначала схема:
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...