Jump to content
Калькуляторы

sc: скрипт для управления Linux-шейпером

Подскажите, может кто сталкивался с похожей ситуацией:

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

Пробовал на ядрах 3.2 и 3.16. Сетевые карты на серверах объединены в bond по 2 Гбит

Share this post


Link to post
Share on other sites

Это известная особенность полисинга. По большому счету, им можно регулировать только пакетрейт, а не битрейт. Надо эмпирически настраивать burst и полосу для того, чтобы скорость соответствовала номиналу, и контролировать это дело iperf'ом. Если у вас полоса до 2 Гбит/с, то можно спокойно сидеть на шейпинге. У знакомого процессор уходил в потолок из-за глобального лока в HTB начиная где-то с 4-х Гбит/с.

Edited by photon

Share this post


Link to post
Share on other sites

К сожалению один из серверов довольно старый и не тянет шейпинг уже на ~1.5 Гбит, а выкинуть его нет возможности

Каким-то образом всё заработало с policer_burst_ratio = 0.2

Share this post


Link to post
Share on other sites

Это хорошо, что линейная зависимость сохраняется даже при высоких скоростях. Поставлю 0.2 как значение по умолчанию.

Edited by photon

Share this post


Link to post
Share on other sites

Я так понимаю, что создается отдельное правило на каждый ip?

Можно ли создать с помощью данного решения приоритеты внутри клиента(ip адреса)? без лишних танцев с бубном.

Share this post


Link to post
Share on other sites

Нет, в sc так делать нельзя. Это сожрет классы, которых всего 2^16-2, и их не хватит на всех клиентов. Приоритеты внутри очереди лучше делать на стороне клиента, например, продав ему пренастроенный маршрутизатор или услуги по такой настройке. В Винде оно настраивается через консоль Local Group Policy Editor. Для совсем тупых некоторые игровые материнки уже из коробки имеют софт для управления сетевым трафиком.

Edited by photon

Share this post


Link to post
Share on other sites

Нет, в sc так делать нельзя. Это сожрет классы, которых всего 2^16-2, и их не хватит на всех клиентов. Приоритеты внутри очереди клиента лучше делать на стороне клиента, например, продав ему пренастроенный маршрутизатор или услуги по такой настройке. В Винде оно настраивается через консоль Local Group Policy Editor. Для совсем тупых некоторые игровые материнки уже из коробки имеют софт для управления сетевым трафиком.

 

А я уже обрадовался было. Ваше решение 100% охвата и простой реализации не позволяет.

 

Тем более что 65534 классов поделить на 5 классов для одного клиента(1 родительский и 4 дочерних) и получится таки вполне нормально...

Share this post


Link to post
Share on other sites

Стоит ли добавить автоматический bypass для IP-адресов сетевух шейпера, чтобы его не вырубало при загрузке правил из базы, где нет его адресов?

Edited by photon

Share this post


Link to post
Share on other sites

Стоит ли добавить автоматический bypass для IP-адресов сетевух шейпера, чтобы его не вырубало при загрузке правил из базы, где нет его адресов?

 

Думаю стоит. Можно для этого в конфиге параметр завести.

Share this post


Link to post
Share on other sites

Думаю стоит. Можно для этого в конфиге параметр завести.

Сделал так. Параметр default_policy теперь может принимать три значения: block-all (блокировать строго все, чего нет в базе), block (блокировать все, кроме самого шейпера), pass (пропускать все).

Share this post


Link to post
Share on other sites

Сделал так. Параметр default_policy теперь может принимать три значения: block-all (блокировать строго все, чего нет в базе), block (блокировать все, кроме самого шейпера), pass (пропускать все).

Отлично. Считаю будет необходимым.

Share this post


Link to post
Share on other sites

Photon , скажите пожалуйста почему в sub tc_batch_start "$tc -batch" поменялось на "$tc -batch -"?

Что значит этот дополнительный дефис?

 

Вчера переходил с Debian 7 на 8 и не мог долго запустить SC . У меня 1.5.1, не обновляюсь потому, что модификаций наделал.

Edited by babay951

Share this post


Link to post
Share on other sites

Вот этот коммит: https://bitbucket.org/sky/sc/commits/5ff17f4581d463e11d5755d3662890e31d7354cf?at=default

Начиная с каких-то версий от 2013 года, tc -batch не читал данные из пайпа без этого дефиса, поэтому пришлось добавить. А вы с какой целью интересуетесь? С последним iproute2 все работает.

Edited by photon

Share this post


Link to post
Share on other sites

Да вот нигде не нашел в документациях, что это за дефис такой, который обнаружил после 4 часов сверки и дебага кода. Стало интересно. Всё прекрасно работает.

Edited by babay951

Share this post


Link to post
Share on other sites

Вся информация об изменениях есть в истории коммитов, пользуйтесь системами контроля версий.

Share this post


Link to post
Share on other sites

не подскажите по реализации команды sync.

не силен в перле, по коду не понял как реализуется sync.

 

при выполнении sync все правила дропаются и добавляются по новой из базы?

 

или все таки происходит поиск по текущим правилам и если есть изменения с базой, то меняются только некоторые правила и добавляются\удаляются новые и отсутствующие записи?

Edited by u234

Share this post


Link to post
Share on other sites

происходит поиск по текущим правилам и если есть изменения с базой, то меняются только некоторые правила и добавляются\удаляются новые и отсутствующие записи?

Да, именно так. Иначе бы не было смысла вводить отдельную команду.

Edited by photon

Share this post


Link to post
Share on other sites

Может кто сталкивался:

sc версии 1.5.1

OS: Debian 7.8

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

Заключительная часть фильтров выглядит так:

filter parent 1: protocol all pref 20 u32
filter parent 1: protocol all pref 20 u32 fh 803: ht divisor 1
filter parent 1: protocol ip pref 30 u32
filter parent 1: protocol ip pref 30 u32 fh 802: ht divisor 1
filter parent 1: protocol ip pref 30 u32 fh 802::800 order 2048 key ht 802 bkt 0 terminal flowid ???
 match 00000000/00000000 at 0
police 0x7b rate 0bit burst 0b mtu 1b action pass overhead 0b
ref 1 bind 1

 

 

Все тоже самое:

sc версии 1.5.1

OS: Debian 8.4

Пропускает только те ипшники, что есть в базе, все остальное режет (кого нет в базе):

filter parent 1: protocol all pref 20 u32
filter parent 1: protocol all pref 20 u32 fh 803: ht divisor 1
filter parent 1: protocol ip pref 30 u32
filter parent 1: protocol ip pref 30 u32 fh 802: ht divisor 1
filter parent 1: protocol ip pref 30 u32 fh 802::800 order 2048 key ht 802 bkt 0 terminal flowid ???
 match 00000000/00000000 at 0
police 0x4 rate 0bit burst 0b mtu 1b action reclassify overhead 0b
ref 1 bind 1

 

Очень смущает action reclassify. Конфиги идентичны, (скрипт собственно взят с первой машины).

Есть подозрения, что дело все в новом tc (iproute2) пакет.

 

Может кто подскажет, как reclassify заменить на pass? (в скрипте, в нужных секциях, поправлено уже все на pass, нету такого действия как reclassify).

Share this post


Link to post
Share on other sites

Судя по всему нашел:

Как я понял, это плавающий между версиями iproute2 "нюанс" - просто "drop" работает всегда "action drop" в некоторых версиях игнорируется из-за "action" и тогда работает действие по умолчанию - "reclassify". Проще говоря лучше аргумент "action" опускать.

 

Буду тестить.

Share this post


Link to post
Share on other sites

Привет. Подскажите пожалуйста, имеется 2 локальных сети, как указать их в конфиге? in_if = eth1, eth3

Share this post


Link to post
Share on other sites

2 конфигурационных файла, 2 раза запускать sc с указанием разных конфигов.

Share this post


Link to post
Share on other sites

2 конфигурационных файла, 2 раза запускать sc с указанием разных конфигов.

спасибо большое за ответ, буду пробовать, но

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

Share this post


Link to post
Share on other sites

Если эти два интерфейса не для балансировки, то в локальных сетях будут разные IP. Соответственно, базы аккаунтов и экземпляры sc для каждой из сетей должны быть разными. А если интерфейсы используются для балансировки, то их проще объединить в один виртуальный (LACP bonding) и повесить sc уже на него.

Edited by photon

Share this post


Link to post
Share on other sites

Первая сеть лан, вторая wifi, объединять не нужно. Сделал 2 разных конфига с двумя разными бд, но при запуске второй выдает

RTNETLINK answers: File exists

Command failed -:7

внешний интерфейс один

 

--

во втором конфиге убрал внешний интерфейс, запуская сперва конфиг без внешнего интерфеса, потом второй конфиг, пока всё ок

может сделать 3 конфига на каждый из интерфейсов?

 

----

не катит, без указания внешнего интерфейса ограничивается и передача в локалке

подскажите что делать :)

Edited by MrZhuliK

Share this post


Link to post
Share on other sites

Нашел данную программу. Возник вопрос по конфигурации. Возможно ли с ее помощью создавать классы для htb.

Родительский клас и так далее. Я для этого использую htb.init но поместить настройки в базу данных

весьма неплохое решение и работает прога шустро.

Еще не заметил возможности добавлять марки пакетов и порты. Сгенерил небольшой пример. Посмотрите как такое реализовать при помощи sc. Два класса для тарифов, внутри классов нарезка для конкретных ип или групп. Субнет вычисляется по хэшу, а классы это уже для htb.

 

/sbin/tc qdisc del dev eth0 root

/sbin/tc qdisc add dev eth0 root handle 1 htb default 30 r2q 32

 

/sbin/tc class add dev eth0 parent 1: classid 1:2 htb rate 100Mbit

/sbin/tc filter add dev eth0 parent 1:0 prio 200 handle 3: protocol ip u32 divisor 256

 

/sbin/tc class add dev eth0 parent 1:2 classid 1:11 htb rate 20Mbit ceil 30Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:11 handle 11 esfq perturb 10

/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 handle 80 fw classid 1:11

/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 200 u32 match ip sport 443 0xffff match ip dst 192.168.1.4 classid 1:11

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 3:0x04 match ip dst 192.168.1.4 flowid 1:11

 

/sbin/tc class add dev eth0 parent 1:2 classid 1:256 htb rate 30Mbit ceil 40Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:256 handle 256 esfq perturb 10

 

/sbin/tc class add dev eth0 parent 1:256 classid 1:12 htb rate 10Mbit ceil 20Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:12 handle 12 esfq perturb 10

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 3:0x0c match ip dst 192.168.1.12 flowid 1:12

 

/sbin/tc class add dev eth0 parent 1:256 classid 1:16 htb rate 10Mbit ceil 20Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:16 handle 16 esfq perturb 10

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 3:0x10 match ip dst 192.168.1.16 flowid 1:16

 

/sbin/tc class add dev eth0 parent 1:2 classid 1:512 htb rate 40Mbit ceil 60Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:512 handle 512 esfq perturb 10

 

/sbin/tc class add dev eth0 parent 1:512 classid 1:15 htb rate 20Mbit ceil 30Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:15 handle 15 esfq perturb 10

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 3:0x0f match ip dst 192.168.1.15 flowid 1:15

 

/sbin/tc class add dev eth0 parent 1:512 classid 1:17 htb rate 20Mbit ceil 30Mbit burst 50k prio 3

/sbin/tc qdisc add dev eth0 parent 1:17 handle 17 esfq perturb 10

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 3:0x11 match ip dst 192.168.1.17 flowid 1:17

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 3:0x12 match ip dst 192.168.1.18 flowid 1:17

 

/sbin/tc filter add dev eth0 protocol ip parent 1:0 prio 200 u32 ht 800:: match ip dst 192.168.1.0/24 hashkey mask 0x000000ff at 16 link 3:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now