Перейти к содержимому
Калькуляторы

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

Изменено пользователем babay951

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем babay951

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

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

Изменено пользователем u234

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем photon

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

RTNETLINK answers: File exists

Command failed -:7

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

 

--

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

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

 

----

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

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

Изменено пользователем MrZhuliK

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нашел данную программу. Возник вопрос по конфигурации. Возможно ли с ее помощью создавать классы для 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.