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

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

После этого инет грохнулся.(Сижу под виндой на работе).При чем с шлюза пинги не проходили.=(

Надо сначала все отладить в сети из виртуальных машин, а потом уже внедрять.

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

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


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

У меня такое чувство что просто база не коннектится,можете написать поподробнее по поводу как создать,кого добавить как юзера и т.п.Пробовал заюзать genbase,не хочет заполнять.

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


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

Настройки по умолчанию ориентированы на работу с локальной базой данных в формате SQLite3, поэтому все должно работать, если файл /etc/sc/sc.db доступен для записи тому пользователю, из-под которого запускается sc. Если нужно настроить загрузку данных из биллинга на отдельной машине, то надо редактировать в /etc/sc/sc.conf соответствующие параметры db_* и query_*.

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

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


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

Вообще говоря, по умолчанию IP-адрес помечен как первичный ключ, поэтому такого быть не должно. Найти дубликаты можно, выполнив к базе следующий SQL-запрос:

SELECT ip, COUNT(ip) AS dup_count
FROM table
GROUP BY ip
HAVING (COUNT(ip) > 1)

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

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


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

Столкнулся с проблемой: через роутер не проходит более 1 гбит/с трафика. Использую версию sc 1.1.2, т. к. наложил пробегавший тут патч a0d75 для общего ограничения скорости нескольких айпи. Абоненты стали жаловаться на медленный интернет в часы пик (потерь пакетов нет!). Симптомы следующие:

 

#sc init

#sc add ...

 

сервер не нагружен

 

#w

load average: 0,39, 0,52, 0,48

 

#sar -u ALL 3

Linux 3.2.1-gentoo-r2 (core) 11.10.2012 _x86_64_ (8 CPU)

 

00:04:06 CPU %usr %nice %sys %iowait %steal %irq %soft %guest %idle

00:04:09 all 8,18 0,00 3,08 0,00 0,00 0,00 33,29 0,00 55,46

00:04:12 all 6,60 0,00 2,23 0,08 0,00 0,00 32,34 0,00 58,75

00:04:15 all 7,72 0,00 2,50 0,21 0,00 0,00 32,10 0,00 57,46

...

 

#cat /proc/net/stat/ipt_netflow | grep Rate

Rate: 903167378 bits/sec, 140088 packets/sec; Avg 1 min: 919100929 bps, 142096 pps; 5 min: 998652773 bps, 150989 pps

 

Rate более 1 гбита не поднимается, pps 150000

 

если сделать sc reset то пропускная способность сразу возрастает в разы:

 

#sc reset

#sleep 10

#cat /proc/net/stat/ipt_netflow | grep Rate

Rate: 1569569010 bits/sec, 217051 packets/sec; Avg 1 min: 1552245870 bps, 215591 pps; 5 min: 1375383290 bps, 194454 pps

 

Rate в пиках доходит до 1.8 гбит/с, pps до 200000

 

на загрузке роутера это никак не сказывается

 

схема:

 

бондинг bond0 из 3-х сетевых intel, на этом бондинге есть vlan257

 

out_if = ifb0

in_if = vlan257

 

ifb0 поднимается стандартно

 

/sbin/ip link set ifb0 up

/sbin/tc qdisc add dev vlan257 ingress

/sbin/tc filter add dev vlan257 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

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


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

Столкнулся с проблемой: через роутер не проходит более 1 гбит/с трафика. Использую версию sc 1.1.2, т. к. наложил пробегавший тут патч a0d75 для общего ограничения скорости нескольких айпи. Абоненты стали жаловаться на медленный интернет в часы пик (потерь пакетов нет!).

Если трафик классифицируется правильно и попадает в классы, то нужно увеличить размеры очередей дочерних классов: поставить в sc.conf параметр leaf_qdisc = 'pfifo limit 100' вместо 50, а то и больше.

 

Другая причина может быть в том, что входящий трафик неправильно классифицируется, если шейпер повешен на интерфейс, через который ходит тегированный трафик. Нужные оффсеты могут быть смещены на 4 байта, которые добавляются при инкапсуляции 802.1q. Советую проверить это дело с помощью tcpdump.

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

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


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

Трафик классифицируется правильно, сегодня попробую увеличить размеры очередей. Спасибо за совет!

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


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

Не помогло: если сделать только sc init без загрузки правил - через роутер не проходит более 1 гбит/с. Если сделать sc reset - пропускная способность поднимается до 1,5 гбит/с. Снова делаешь sc init - опять падает до 1 гбит/с. Т. е. при инициализации хэш фильтров упираемся в 1 гбит/с пропуской способности.

 

Выяснил что это из за заворота на ifb интерфейс (для ограничения исходящей), буду менять схему

Изменено пользователем Петрович-2012

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


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

в последней версии нужно поправить строчку 1963:

 

if (!defined $rul_rate) { $rul_rate = 0; }

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


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

в последней версии нужно поправить строчку 1963:

 

if (!defined $rul_rate) { $rul_rate = 0; }

Лучше $rul_rate ||= 0;

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


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

в последней версии нужно поправить строчку 1963:

 

if (!defined $rul_rate) { $rul_rate = 0; }

Лучше $rul_rate ||= 0;

Вы так говорите, как будто

if (!defined $rul_rate) $rul_rate = 0;

без фигурных скобок не работает, а ||= не будет ругаться на неинициализированную переменную.

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

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


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

Вы так говорите, как будто

if (!defined $rul_rate) $rul_rate = 0;

без фигурных скобок не работает

Проверьте.

 

а ||= не будет ругаться на неинициализированную переменную.

Проверьте :)

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


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

$a ||= 0 -- хороший трюк, спасибо за подсказку.

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


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

Интересует вопрос по масштабируемости: нужно как обычно решать задачу shaping+nat+netflow для нескольких тысяч абонентов. До текущего момента всё крутилось на одном сервере, сейчас трафик перевалил за 1 гигабит и сервер перестал справляться. Вариантов на мой взгляд всего два (не считая покупки мощной циски):

 

1. shaping на одной машине, nat+netflow на другой. Всё здорово, однако количество сетевых карт в каждом сервере растет пропорционально гигабитам трафика

 

2. Несколько серверов, каждый будет делать shaping+nat+netflow для небольшой группы абонентов. Всё хорошо масштабируется, но теперь пропорционально растет количество серверов, нужно постоянно следить за загрузкой и своевременно добавлять новые серверы

 

может я что-то упустил?

Изменено пользователем Петрович-2012

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


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

Лучше отказаться от NAT, получить статус LIR и раздавать юзерам белые IP из имеющегося пула. Если NAT все-таки останется, функции шейпинга лучше отделить от функций border router (NAT, BGP), будет меньше проблем с диагностикой. Ну да, придется дополнительно купить несколько машин и сетевых адаптеров. Если от NAT удалось избавиться, можно смело совмещать функции шейпера и бордера на одной машине. Для обеспечения failover, на каждом шейпере нужно создать набор правил для всех IP-адресов сети (там хэши, и от числа правил ничего не зависит), воткнуть их в L3-коммутатор, на котором созданы соответствующие маршруты. Вариант "несколько дешевых shaping bridges со встроенными гигабитными портами + один мощный border router с многопортовыми картами" можно реализовать с помощью LACP.

 

Кроме того, поскольку 10-гигабитные адаптеры уже сравнялись по стоимости с многопортовыми гигабитными и поддерживаются современными ядрами, то вполне можно рассмотреть варианты их использования.

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

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


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

У нас есть своя AS, адресов пока достаточно, однако на перспективу их на всех не хватит, новые адреса IPV4 RIPE перестал выдавать, поэтому без NAT никуда :(

 

Насчет 10-гбитных адаптеров пока сомневаюсь, т. к. PCI шина вроде как не позволяет им работать на скоростях более 4 гбит/с (где то видел тесты). Скорее всего буду использовать вариант "несколько дешевых shaping bridges"

Изменено пользователем Петрович-2012

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


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

Насчет 10-гбитных адаптеров пока сомневаюсь, т. к. PCI шина вроде как не позволяет им работать на скоростях более 4 гбит/с (где то видел тесты).

Во всех серверных решениях сетевые адаптеры (включая встроенные) вешают на шину PCI Express. Теоретическая пропускная способность одного lane шины PCIe v2.0 -- 500 MByte/s или 4 Gbit/s, PCIe v3.0 -- почти в два раза больше.

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

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


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

photon, спасибо за замечательный скрипт

 

Поставил свежее ядро, свежий sc, свежий iproute2 и всё стало отлично. В ближайшее время попробую несколько гбит прокрутить

 

возможно кому-то пригодится мой небольшой патч: классификатор u32, режим shaping

Что делает патч:

1. отключает блокирование всего трафика

2. IP с нулевой скоростью заворачивает в корневую дисциплину без создания подкласса (возможно кому то понадобится если пункт 1 включить)

3. позволяет ставить общее ограничение скорости нескольким IP (работа со встроенной БД не поддерживается), например

sc add 192.168.3.12 6000kibit 1234

sc add 192.168.5.41 6000kibit 1234

sc add 192.168.6.33 6000kibit 1234

и т. д. где 1234 - class_id.

 

--- sc.original 2011-10-20 16:01:36.000000000 +0400
+++ sc.patched  2012-10-16 15:47:27.000000000 +0400
@@ -93,7 +93,7 @@
               # database handler (optional)
               'dbhandler' => \&cmd_dbadd,
               # arguments (optional)
-               'arg' => '<ip> <rate>',
+               'arg' => '<ip> <rate> <class>',
               # command description
               'desc' => 'add rules',
               # check root privileges before execution (optional)
@@ -115,7 +115,7 @@
       'del|rm' => {
               'handler'   => \&cmd_del,
               'dbhandler' => \&cmd_dbdel,
-               'arg'       => '<ip>',
+               'arg'       => '<ip> <class>',
               'desc'      => 'delete rules',
               'priv'      => 1,
       },
@@ -655,6 +655,15 @@
       return $!;
}

+sub is_class
+{
+        if ($_[0] <= 0 || $_[0] > 65535) {
+            return 0;
+        } else {
+            return $_[0];
+        }
+}
+
sub arg_check
{
       my ($issub, $arg, $argname) = @_;
@@ -688,7 +697,7 @@
       my ($num, $unit);

       if (($num, $unit) = $rate =~ /^([0-9]+)([A-z]*)$/xms) {
-               return 0 if $num == 0;
+#              return 0 if $num == 0;
               if (nonempty($unit)) {
                       foreach my $u (keys %units) {
                               if ($unit =~ /^(?:$u)$/xms) {
@@ -791,7 +800,7 @@

       while (my $ref = $sth->fetchrow_arrayref()) {
               ($intip, $rate) = @{$ref};
-               if (!defined $rate) {
+               if (!nonempty($rate)) {
                       log_carp("IP $ip has undefined rate, skipping\n");
                       next;
               }
@@ -1342,10 +1351,10 @@
       }

       # block all other traffic
-       $TC->(
-               "filter add dev $dev parent 1:0 protocol ip pref $pref_default ".
-               'u32 match u32 0 0 at 0 police mtu 1 action drop'
-       );
+#      $TC->(
+#              "filter add dev $dev parent 1:0 protocol ip pref $pref_default ".
+#              'u32 match u32 0 0 at 0 police mtu 1 action drop'
+#      );
       return $?;
}

@@ -1362,7 +1371,8 @@
sub u32_dev_add
{
       my ($dev, $cid, $rate, $ceil, $match, $ht, $key) = @_;
-
+       my ($num, $unit) = $rate =~ /^([0-9]+)([A-z]*)$/xms;
+       if($num) {
       $TC->(
               "class replace dev $dev parent 1: classid 1:$cid htb ".
               "rate $rate ceil $ceil quantum $quantum"
@@ -1370,6 +1380,11 @@
       $TC->(
               "qdisc replace dev $dev parent 1:$cid handle $cid:0 $leaf_qdisc"
       );
+       }
+        else {
+           $cid = 0;
+        }
+
       $TC->(
               "filter replace dev $dev parent 1: pref $pref_leaf ".
               "handle $ht:$key:800 u32 ht $ht:$key: match $match flowid 1:$cid"
@@ -1851,20 +1866,20 @@

sub cmd_add
{
-       my ($ip, $rate) = @_;
+       my ($ip, $rate, $class) = @_;

       arg_check(\&is_ip, $ip, 'IP');
       $rate = arg_check(\&is_rate, $rate, 'rate');
-       my $cid = ip_classid($ip);
-       return $rul_add->($ip, $cid, $rate);
+       my $cid = arg_check(\&is_class, $class, 'class');
+        return $rul_add->($ip, $cid, $rate);
}

sub cmd_del
{
-       my ($ip) = @_;
+       my ($ip, $class) = @_;

       arg_check(\&is_ip, $ip, 'IP');
-       my $cid = ip_classid($ip);
+       my $cid = arg_check(\&is_class, $class, 'class');
       return $rul_del->($ip, $cid);
}

@@ -1960,6 +1975,7 @@
               }
               # change if rate in database is different
               my $rul_rate = $rul_data{$dcid}{'rate'};
+               if (!defined $rul_rate) { $rul_rate = 0; }
               if ($rul_rate ne $db_rate) {
                       my $ip = $db_data{$dcid}{'ip'};
                       print "* $ip $rul_rate -> $db_rate\n" if $verbose & VERB_ON;

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


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

Спасибо, сделаю багфикс-версию. Когда будет время, я планирую все переписать на Python в объектно-ориентированном стиле и добавить поддержку HFSC.

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

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


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

sc dbcreate или sc help

Global symbol "$ip" requires explicit package name at /usr/sbin/sc line 1964.

BEGIN not safe after errors--compilation aborted at /usr/sbin/sc line 2175.

 

Что же ему не нравится?

Все по инстукции, модули поставлены, база настроена

Linux i 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux

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


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

Скачайте здесь, там дурацкая ошибка при выводе сообщения о неопределенной полосе пропускания: https://bitbucket.org/sky/sc/get/tip.tar.bz2

На Sourceforge тоже все обновил.

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

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


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

Скачайте здесь, там дурацкая ошибка при выводе сообщения о неопределенной полосе пропускания: https://bitbucket.org/sky/sc/get/tip.tar.bz2

На Sourceforge тоже все обновил.

Спасибо помоголо

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


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

А так-же ключик --set для iptables уже депрекейтед и надо пользовать --match-set и для ipset комбинация -nsL не канает и надо -n -s -L

 

А еще нужно в конфиг внести опцию "не блокировать трафик от ip без шейпера" и включить ее по умолчанию. Иначе, это доставляет оргазмы при спешной инсталяции на _удаленном_ сервере.

 

В остальном - скрипт чоткий и, вероятно, это самая удобная оболочка для мутного tc из виденных мной. Респект автору. Пеши ищо.

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


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

Join the conversation

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

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

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

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

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

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

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