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

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

Если через них ходит нетегированный трафик, то будет работать и так. Если тегированный, то нужно увеличить смещения для хэш-фильтров:

 

@@ -1092,8 +1093,8 @@

sub shaper_init
{
-   shaper_dev_init($i_if, 'dst', 16) if $i_if_enabled;
-   shaper_dev_init($o_if, 'src', 12) if $o_if_enabled;
+   shaper_dev_init($i_if, 'dst', 20) if $i_if_enabled;
+   shaper_dev_init($o_if, 'src', 16) if $o_if_enabled;
   return $?;
}

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


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

Коллеги, кто использует у себя использует sc с несколькими ip адресами в одном классе, можете поделится патчем или готовым скриптом? К сожалению патч от Петрович-2012 от старой версии, и те функции что он патчит, уже в новой версии нет, и не понятно как исправить.

Встроенную бд не использую, мне подойдет любое рабочее решение, с любыми костылями, но очень нужно резать скорость для нескольких ip.

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


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

Я могу сделать такое решение, адаптированное под ваш биллинг. Обращайтесь в личку. Поскольку между IP-адресами и классами не будет взаимооднозначного соответствия, номера классов (id пользователя) должны храниться в базе.

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


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

sc: network xxx.xxx.xxx.xxx/xx overfulls classid space at ./sc line 636
main::log_croak('network 10.212.96.0/24 overfulls classid space') called at ./sc line 827
main::set_class_nets() called at ./sc line 399
main::main('list') called at ./sc line 373

 

я полагаю мне не судьба посмотреть и воспользоваться в том виде в каком оно есть?

имеются подсети вида 10.aaa.bbb.0/24, 10.ccc.ddd.0/24 и 10.eee.fff.0/24. Суммарно то абонентов на шейпер не превысит максимальное количество в 65534, однако, просуммировав подсети получаем их в количестве 363 штуки, что выливается в 92565 адреса. Overfull :(

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


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

Да, нужно размещать пользователей по подсетям более компактно.

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


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

Да, нужно размещать пользователей по подсетям более компактно.

 

Эх, как говорят тут так исторически сложилось(

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


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

Нужно хранить в базе номера классов, чтобы не вычислять их из IP-адресов. Это позволит обойти данное ограничение.

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


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

Нужно хранить в базе номера классов, чтобы не вычислять их из IP-адресов. Это позволит обойти данное ограничение.

 

Спасибо, попробую на днях

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


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

В sc 1.5 с perl 5.14.2 в Ubuntu 13.10 ошибка в syslog facility и severity - вместо переменных "LOG_USER" и "LOG_WARNING" используются "user" и "warn", соответственно. Это вызывает ошибку при попытке использования syslog=1:

 

syslog: invalid level/facility: warn at /usr/local/sbin/sc line 613

 

И вообще он что-то криво работает под свежей убунтой, сижу, разбираюсь - sc list, например, ничего не показывает, хотя какие-то правила есть.

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

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


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

Или вот просто sc reset:

 


# sc -d 2 reset
verbose = 1
/sbin/tc qdisc del dev eth0.199 handle ffff: ingress
/sbin/tc qdisc del dev eth0.199 root handle 1: htb


# /sbin/tc qdisc del dev eth0.199 handle ffff: ingress
RTNETLINK answers: Invalid argument


# /sbin/tc qdisc del dev eth0.199 root handle 1: htb
RTNETLINK answers: Invalid argument

# /sbin/tc qdisc show dev eth0.199

# /sbin/tc qdisc show dev eth0.504 
# /sbin/tc qdisc show dev eth0
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
#

 

Так и должно быть?

 

 

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


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

В версии 1.5 немного поменялся конфиг. Нужно убедиться, что все совместимо. Я не гарантирую работоспособности на vlan-интерфейсах, потому что не тестирую скрипт в такой конфигурации. Межвлановую маршрутизацию нужно делать на другом оборудовании, а не вместе с per-user QoS.

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

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


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

С 1.3.4 оказалось не совместимо, да. И вообще оно настолько странно работает, что я уже опасаюсь её крутить на реальной машине, в виртуалку перешёл.

 

Вот старый конфиг:

 

tc = /sbin/tc
iptables = /sbin/iptables
ipset = /usr/sbin/ipset
out_if = ifb0
in_if = eth0.199
filter_method = u32
limit_method = hybrid
debug = 1
verbose = 1
quiet = 0
colored = 1
joint = 0
network = 10.1.63.0/24 10.1.64.0/18 10.1.129.0/24
filter_network = 10.1.63.0/24 10.1.64.0/18 10.1.129.0/24
policer_burst_ratio = 0.1
quantum = 1500
rate_unit = kibit
rate_ratio = 1.0
leaf_qdisc = 'pfifo limit 50'
db_driver = mysql
db_host = 127.0.0.1
db_name = nat
db_user = gate
db_pass = JMKSsFTD6
query_create = "select 1"
query_load = "SELECT inet_aton(ip) as ip, rate FROM shapers where rate>0"
query_list = "SELECT inet_aton(ip) as ip, rate FROM shapers where rate>0"
query_add = "select 1"
query_del = "select 1"
query_change = "select 1"
syslog = 0

 

Новый конфиг:

 

tc = /sbin/tc
out_if = eth0.504
in_if = eth0.199
limit_method = hybrid
debug = 1
verbose = 1
quiet = 0
colored = 1
joint = 0
network = 10.1.63.0/24 10.1.64.0/18 10.1.129.0/24
filter_network = $network
policer_burst_ratio = 0.1
quantum = 1500
rate_unit = kibit
rate_ratio = 1.0
leaf_qdisc = 'pfifo limit 50'
db_driver = mysql
db_host = 127.0.0.1
db_name = nat
db_user = gate
db_pass = JMKSsFTD6
query_create = "select 1"
query_load = "SELECT inet_aton(ip) as ip, rate FROM shapers where rate>0"
query_list = "SELECT inet_aton(ip) as ip, rate FROM shapers where rate>0"
query_add = "select 1"
query_del = "select 1"
query_change = "select 1"
syslog = 1
syslog_options = 'perror'
syslog_facility = LOG_DAEMON

 

C таким новым конфигом, например, у меня перестали проходить пакеты от меня через внутренний интерфейс eth0.199. ARP ещё проходят, а вот третий уровень уже воообще нет.

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

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


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

В старом конфиге было:

out_if = ifb0

in_if = eth0.199

 

а в новом стало:

out_if = eth0.504

in_if = eth0.199

 

Возможно, причина в этом. Проверьте через tcpdump, ходит ли через интерфейсы тегированный трафик, у которого все поля смещены на 4 байта.

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

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


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

C таким новым конфигом, например, у меня перестали проходить пакеты от меня через внутренний интерфейс eth0.199. ARP ещё проходят, а вот третий уровень уже воообще нет.

Подозреваю что надо смотреть на SC со слов "# block all other traffic".

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


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

Подозреваю что надо смотреть на SC со слов "# block all other traffic".

Если трафик не проходит через созданные для него фильтры и режется этим правилом, то он и шейпиться не будет. Нужно использовать простые конфигурации: шейпер на выделенной машине в режиме моста, без вланов. Вланы нужно маршрутизировать до шейпера на L3-коммутаторе.

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

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


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

Нужно использовать простые конфигурации: шейпер на выделенной машине в режиме моста, без вланов. Вланы нужно маршрутизировать до шейпера на L3-коммутаторе.

Вовсе не обязательно. У нас tc замечательно режет трафик на qinq BRASе(на входе трафик прилетает с 2 тегами, улетает с 1). Единственное что требует правки - указывать в фильтрах protocol any(или 802.1q) вместо protocol ip как по учебнику(ибо тегированный трафик с точки зрения фильтров вовсе не IP). Ну а где в пакете начинается IP tc посчитает сам.

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

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


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

Коллеги, а кто-нибудь раскочегарил больше 1mpps?

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


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

Коллеги, а кто-нибудь раскочегарил больше 1mpps?

Если поставить 10-гигабитные сетевухи, то вполне возможно. Максимум, что я видел -- до 700 kpps в пиках на спаренных гигабитных портах.

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

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


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

Вовсе не обязательно. У нас tc замечательно режет трафик на qinq BRASе(на входе трафик прилетает с 2 тегами, улетает с 1). Единственное что требует правки - указывать в фильтрах protocol any(или 802.1q) вместо protocol ip как по учебнику(ибо тегированный трафик с точки зрения фильтров вовсе не IP). Ну а где в пакете начинается IP tc посчитает сам.

Я так понимаю у вас стоит accel-ppp? Подскажите пожалуйста как вы организовали шейпер по классам трафика? Читал на локале и тут ваши посты, но толком ничего не понял. Можно примерную схему вашей сети и пример конфига, чтобы знать откуда плясать. Заранее огромное спасибо.

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


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

Коллеги, а кто-нибудь раскочегарил больше 1mpps?

Если поставить 10-гигабитные сетевухи, то вполне возможно. Максимум, что я видел -- до 700 kpps в пиках на спаренных гигабитных портах.

Меня интересует практический результат. Пока у меня получается примерно 1mpps, при загрузке ядер под 50%, но выше начинает скакать пинг и прыгать скорость.

Часто появляются дропы в отдельных классах (хотя скорость много ниже шейпера), хотя у других все нормально - вот это вообще непонятная проблема.

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


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

Меня интересует практический результат. Пока у меня получается примерно 1mpps, при загрузке ядер под 50%, но выше начинает скакать пинг и прыгать скорость.

Часто появляются дропы в отдельных классах (хотя скорость много ниже шейпера), хотя у других все нормально - вот это вообще непонятная проблема.

Так с ходу сложно сказать. Какие настройки используются для распределения нагрузки от softirq? Включен ли MSI-X? На этот счет есть противоречивые сведения: на одном железе помогает interrupt pinning и отключение msi-x, на другом -- наоборот помогает распределение по всем процессорам и включение msi-x: http://natsys-lab.blogspot.de/2012/09/linux-scaling-softirq-among-many-cpu.html . Какие размеры rx/tx rings установлены с помощью ethtool? Каков размер виртуальной очереди для отправки пакетов (параметр txqueuelen в ifconfig). Возможно, для отдельных классов, в которых появляются дропы, стоит увеличить размер очереди (параметр limit) и использовать краевую дисциплину codel.

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

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


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

прерывания прибиты по ядрам, ixgbe в дефолте

ethtool -G eth0 rx 4096 tx 4096

ethtool -K eth0 rx off tx off tso off gso off gro off

txqueuelen:1000

дисциплина pfifo limit 50

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


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

дисциплина pfifo limit 50

Мало, удвойте-утройте и попробуйте.

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


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

txqueuelen:1000

дисциплина pfifo limit 50

txqueuelen нужно поднять до 4096, limit - минимум до 100 пакетов.

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


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

Join the conversation

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

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

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

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

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

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

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