Шейпер крашит систему :(

Установка, настройка, поддержка
NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Шейпер крашит систему :(

Сообщение NiTr0 »

Решил немного подпилить шейпер - рекомендованный крайне нехорошо справлялся с ограничением исходящего траффика.
Получилось следующее:

Код: Выделить всё

#!/bin/sh
# if-up.local

debug=0;
INPUT=eth0;

if [ -f /var/run/radattr.$1 ]
then
   PPPNUM=`echo $1|sed 's/ppp//'|awk {'printf "%03d",$1'}`
   IP=`ip route list proto kernel|grep "$1 "|awk '{print $1}'`
   echo $IP >/var/run/shaper/$1
   QDISC_ETH=`tc qdisc show dev $INPUT|grep root|awk '{print $2}'`
   DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   FILTERS=`/bin/awk  '/Filter-Id/ {print $2}'  /var/run/radattr.$1`

#   if [ $QDISC_ETH != htb ];
#   then
     tc qdisc del dev $INPUT root >/dev/null
     tc qdisc add dev $INPUT root handle 1: htb default 2 r2q 10
     tc class add dev $INPUT parent 1: classid 1:1 htb rate 100mbit ceil 1000mbit burst 40k prio 2
     tc class add dev $INPUT parent 1: classid 1:2 htb rate 100mbit ceil 1000mbit burst 40k prio 1
#  fi

   if [ w${debug} = w1 ] ; then
     echo "Debug mode" >>/tmp/pptpd
     echo $DOWNSPEED >>/tmp/pptpd
     echo $UPSPEED >>/tmp/pptpd
     echo $FILTERS >>/tmp/pptpd
   fi;

    /sbin/tc qdisc del dev $1 root    > /dev/null
    /sbin/tc qdisc del dev $1 ingress &>/dev/null

##### speed server->client
   if [ "$UPSPEED" != "0" ] ;
   then
     /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 10
     /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit burst 4k
     /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit burst 4k prio 1
     /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit burst 4k prio 2
     /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500
     /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500
     /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
     /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10

#     /sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10
   fi

##### speed client->server
   if [ "$DOWNSPEED" != "0" ] ;
   then
     tc class add dev $INPUT parent 1:1 classid 1:1$PPPNUM htb rate ${DOWNSPEED}kbit ceil ${DOWNSPEED}kbit burst 20k
     tc class add dev $INPUT parent 1:1$PPPNUM classid 1:2$PPPNUM htb rate 32kbit ceil ${DOWNSPEED}kbit burst 20k prio 10
     tc class add dev $INPUT parent 1:1$PPPNUM classid 1:3$PPPNUM htb rate 32kbit ceil ${DOWNSPEED}kbit burst 20k prio 1
     tc qdisc add dev $INPUT parent 1:2$PPPNUM handle 2$PPPNUM: sfq perturb 10 quantum 1500
     tc qdisc add dev $INPUT parent 1:3$PPPNUM handle 3$PPPNUM: sfq perturb 10 quantum 1500

     iptables -t mangle -F
     iptables -t mangle -A PREROUTING -s $IP -j MARK --set-mark 0x3$PPPNUM
     iptables -t mangle -A PREROUTING -s $IP -p icmp -j MARK --set-mark 0x2$PPPNUM
     iptables -t mangle -A PREROUTING -s $IP -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM

     tc filter add dev $INPUT parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
     tc filter add dev $INPUT parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
   fi

#### Filters
  if [ w$FILTERS != w ] ;
  then
    echo "filters not supported";
  fi;

 fi
Очистку таблицы mangle и удаление-создание классов сделал для чистоты эксперимента.
Соответственно if-down.local:

Код: Выделить всё

#!/bin/sh
# if-down.local

debug=0;
INPUT=eth0;

if [ -f /var/run/radattr.$1 ]
then
   PPPNUM=`echo $1|sed 's/ppp//'|awk {'printf "%03d",$1'}`
   IP=`cat /var/run/shaper/$1`
   QDISC_ETH=`tc qdisc show dev $INPUT|grep root|awk '{print $2}'`
   DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   FILTERS=`/bin/awk  '/Filter-Id/ {print $2}'  /var/run/radattr.$1`

   if [ w${debug} = w1 ] ; then
     echo "Debug mode" >>/tmp/pptpd
     echo $DOWNSPEED >>/tmp/pptpd
     echo $UPSPEED >>/tmp/pptpd
     echo $FILTERS >>/tmp/pptpd
   fi;


##### speed server->client
   if [ "$UPSPEED" != "0" ] ;
   then
     /sbin/tc qdisc del dev $1 root    > /dev/null
   fi

##### speed client->server
   if [ "$DOWNSPEED" != "0" ] ;
   then
     tc filter del dev eth0 parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
     tc filter del dev eth0 parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
     tc class del dev $INPUT classid 1:3$PPPNUM
     tc class del dev $INPUT classid 1:2$PPPNUM
     tc class del dev $INPUT classid 1:1$PPPNUM

     iptables -t mangle -D PREROUTING -s $IP -j MARK --set-mark 0x3$PPPNUM
     iptables -t mangle -D PREROUTING -s $IP -p icmp -j MARK --set-mark 0x2$PPPNUM
     iptables -t mangle -D PREROUTING -s $IP -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM

   fi

#### Filters
  if [ w$FILTERS != w ] ;
  then
    echo "filters not supported";
  fi;

 fi
Запускал - вручную, соответственно ./if-up.local pppX и ./ifdown.local pppX
При запуске (многократном) bash -x скрипт (для отладки) - вроде как все работает нормально.
При запуске без отладки if-up (повторном) - сервер падает о0 В логах при этом нет ничего.
Система - Fedora core 8 x86_64. Ядро 2.6.23.1-42 из ее репозитория.
Кто что может посоветовать?

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

1. для линуха сделан шейпер через линкапдаун работающий как для чистого ипн так и для дв (см. ченжлог от 10.09)

запуск для дв (пример скрипта /etc/ppp/ip-pre-up

Код: Выделить всё

#!/bin/sh

TC="/sbin/tc"
TCQA="$TC qdisc add dev $IFNAME"
TCQD="$TC qdisc del dev $IFNAME"

$TCQD root &>/dev/null
$TCQD ingress &>/dev/null

$TCQA root handle 1: htb
$TCQA handle ffff: ingress
/usr/abills/libexec/linkupdown ipn up $IFNAME $PEERNAME $IPREMOTE OS=Linux
поставит лимит скорости на соответствующем ppp ифейсе в соответствии с классами трафика в интервалах (правда порты там не распознаются). Да, исходящий (от клиента) канал там будет резаться по ingress drop :)

2. дописываю плагин в котором распознаются порты в классах в полном объёме и канал режется на ifb (через action mirred egress redirect) так что и туда и обратно траф не дропается а корректно задерживается в очереди к ifb отлажу - выложу

3. разбираться чего ты там наваял влом - юзай мой :D

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Сообщение NiTr0 »

ran писал(а): Да, исходящий (от клиента) канал там будет резаться по ingress drop
Не устраивает - именно по причине непонятного поведения этого шейпера... В стандартном скрипте - тоже ingress drop.
В частности - при burst 12к - у юзеров скорость составляла 30-60% от заданной по результатам speedtest.net, на 2мбит канале отдача была 60 кб/сек; 25к - скорость очень странно прыгает: в начале - 6мбит, после - падает до 1 мбита и в конце держится на этом уровне секунд 10...
Мой шейпер же - сам по себе-то работает, но после симуляции разрыва и последующего реконнекта - сервер перестает пинговаться с любой машины, до ребута. Ехать в серверную насиловать сервер, чтобы посмотреть, как именно он падает - не хочется из-за сравнительно большого кол-ва клиентов на нем...

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

я же грю - уже отладил через ифб всё работает осталось в ппринципе с Асмодеусом согласовать... до завтра что не потерпит?

твой шейпер чем плох:

1. под лимит попадает весь трафик клиента идущий через туннель (а классы трафика на что? там ведь можно разные скорости для подсетей/портов задавать и разные в разное время суток, дни недели etc)

2. неработает :D

стоит ли трнатить время на поиск у тебя ошибки или лучше доделать универсальный для всех?

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Сообщение NiTr0 »

ran писал(а):я же грю - уже отладил через ифб всё работает осталось в ппринципе с Асмодеусом согласовать... до завтра что не потерпит?
В данном дистре ifb, как и imq, замечен мной не был. Это 1-е.
2-е - скрипт в перспективе будет юзаться на роутерах-насах, у которых стоит линукс с ядром 2.4 - и соответственно поддержки данных извращений не имеется.
ran писал(а):1. под лимит попадает весь трафик клиента идущий через туннель (а классы трафика на что? там ведь можно разные скорости для подсетей/портов задавать и разные в разное время суток, дни недели etc)
У меня пппд непатченый, потому классы траффика не сильно волнуют. Локальный траффик и так по локалке гуляет... Иначе - пптп сервер раком встанет, если 1000 (грубо) клиентов через него в локалку ломанутся.
ran писал(а):2. неработает :D
Не работает на конкретной машине с конкретной осью (пока что), в конкретных условиях. Может - на другом ядре/другой машине/другом дистре крашиться не будет. Или на другой машине. Потому как при запуске с bash -x, что замедляет выполнение скрипта - машина не крашится.
ran писал(а):стоит ли трнатить время на поиск у тебя ошибки или лучше доделать универсальный для всех?
Лично мне - выбора нет.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

В данном дистре ifb, как и imq, замечен мной не был. Это 1-е.
ifb входит в стандарт кернел.орг начиная кажется с 2.6.18 imq - нет и никогда не будет
У меня пппд непатченый, потому классы траффика не сильно волнуют.
та причём здесь пппд??? классы (в смысле шейпера) будут работать везде (где есть ifb разумеется) и с пппд и с чистым ипн и без ипн
2-е - скрипт в перспективе будет юзаться на роутерах-насах, у которых стоит линукс с ядром 2.4
ставь на роутеры-насы у которых стоит линукс с ядром 2.6 - таких щас тоже море
Лично мне - выбора нет.
ну... тада ковыряй... мне щас некогда

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Сообщение NiTr0 »

Итак, короткий отчет: после перехода на CentOS проблемы краша не наблюдалось ни разу, работает примерно неделю активно.
Наблюдается другая проблема, необъяснимого характера: при дисконнекте иногда не все правила iptables удаляются, остается одно случайное правило... В среднем - таких "висячих" правил 2-3 в день появляется.

mnk
Сообщения: 192
Зарегистрирован: Ср янв 31, 2007 7:21 am
Откуда: г. Вологда
Контактная информация:

Сообщение mnk »

To ran, Извиняюсь что немного не в тему.
imq, как я понял, можно заменить на ifb
А есть чем заменить - layer7 и esfq? А то в стандартное ядро они не входят, а справедливое деление канала помогают обеспечить, особенно esfq, да и layer7, особенно в случае торентов.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

mnk писал(а):To ran, Извиняюсь что немного не в тему.
imq, как я понял, можно заменить на ifb
не "можно заменить" а использовать вместо потому как с помощью ifb можно реализовать всё то что с imq и гораздо больше... и именно поэтому именно ifb включено в стандартное ядро
А есть чем заменить - layer7 и esfq? А то в стандартное ядро они не входят, а справедливое деление канала помогают обеспечить, особенно esfq, да и layer7, особенно в случае торентов.
насчёт esfq есть альтернативный метод и думаю что именно он будет включён в ядро (если уже не включён)... ну а про уровень 7 не знаю... впрочем у меня с накладыванием этих патчей проблем не возникало

mnk
Сообщения: 192
Зарегистрирован: Ср янв 31, 2007 7:21 am
Откуда: г. Вологда
Контактная информация:

Сообщение mnk »

А как загнать весь трафик с ppp интерфейсов в ifb? В imq это делалось через iptables, а в ifb через tc, как я понял. Только не понял как.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

mnk писал(а):А как загнать весь трафик с ppp интерфейсов в ifb? В imq это делалось через iptables, а в ifb через tc, как я понял. Только не понял как.
An example, to provide functionality that most people use IMQ for below:

--------
export TC="/sbin/tc"

$TC qdisc add dev ifb0 root handle 1: prio
$TC qdisc add dev ifb0 parent 1:1 handle 10: sfq
$TC qdisc add dev ifb0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
$TC qdisc add dev ifb0 parent 1:3 handle 30: sfq
$TC filter add dev ifb0 protocol ip pref 1 parent 1: handle 1 fw classid 1:1
$TC filter add dev ifb0 protocol ip pref 2 parent 1: handle 2 fw classid 1:2

ifconfig ifb0 up

$TC qdisc add dev eth0 ingress

# redirect all IP packets arriving in eth0 to ifb0
# use mark 1 --> puts them onto class 1:1
$TC filter add dev eth0 parent ffff: protocol ip prio 10 u32 \
match u32 0 0 flowid 1:1 \
action ipt -j MARK --set-mark 1 \
action mirred egress redirect dev ifb0

см. файлы из doc/actions/ в сырцах ипроут2

mnk
Сообщения: 192
Зарегистрирован: Ср янв 31, 2007 7:21 am
Откуда: г. Вологда
Контактная информация:

Сообщение mnk »

И где тут перенаправление c ppp+ на ifb0. Я вижу только пернаправление с eth0 на ifb0. Это удобно для ограничения входящего трафика. А мне нужно шейпить только исходящий инетовский трафик (ppp+ VPN).
Сейчас у меня сделано так
$ipt -t mangle -N POST_MY
$ipt -t mangle -I POSTROUTING -o ppp+ -d $in_net -j POST_MY
$ipt -t mangle -A POST_MY -j IMQ --todev 0
Те, не трогая локального трафика, перенаправить с ppp+ на виртуальный интерфейс.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

И где тут перенаправление c ppp+ на ifb0
я привёл пример... а как редиректить с ppp123 сам додумаешь... а насчёт шаблонов в именах ифейсов - ты их видел где-нить в синтаксисе тс? :shock: ткни пальчиком...
мне нужно шейпить только исходящий инетовский трафик (ppp+ VPN).
если под исходящим инетовским трафиком ты понимаешь то же что и я (трафик, уходящий в инет) то это
Сейчас у меня сделано так
$ipt -t mangle -N POST_MY
$ipt -t mangle -I POSTROUTING -o ppp+ -d $in_net -j POST_MY
$ipt -t mangle -A POST_MY -j IMQ --todev 0
полный бред

mnk
Сообщения: 192
Зарегистрирован: Ср янв 31, 2007 7:21 am
Откуда: г. Вологда
Контактная информация:

Сообщение mnk »

Ну не правильно выразился :D - мне нужно шейпить исходящий трафик идущий с инета на пользователей на все интерфейы ppp, не касаясь трафика, идущего по внутренней локальной сети.
Если бы мне нужно было шейпить конкретный ppp123, то для этого виртуальный интерфейс не нужен.
а насчёт шаблонов в именах ифейсов - ты их видел где-нить в синтаксисе тс?
Вот в этом как раз и загвоздка. Способы загнать трафик в виртуальный интерфейс у них разные (у одного через iproute, у другого через iptables)
Если можете предложить, как заменить для данного случая imq на ifb, то и предложите, пожалуйста. Только не надо предлагать запускать каждый раз скрипт, при входе нового пользователя.

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Сообщение ran »

начнём с конца...

На мой взгляд грамотно построенный шейпер должен состоять из 2-х частей:

1. Ограничитель скорости усеров (в обе стороны) согласно классов трафика в тарифных планах (и ничего больше). Разумнее всего (правильнее, эффективнее и проще) это делать именно на ифейсах, смотрящих на усеров (ppp* в случае туннелей, eth или виланы, смотрящие на клиентов - в случае отсутствия туннелей). Тот шейпер, который сейчас включён в линкапдаун именно это и делает. Пока входящий (от клиента) трафик режется грубым и циничным дропом лишнего в ингресс дисциплине. В дальнейшем будет через ифб.

2. Глобальный шейпер выполняющий задачу приоритезации (возможно динамической) всего (в том числе и собственного трафика NAS) инет трафика по портам, протоколам, ип etc. Он должен работать на внешнем ифейсе + ифб. Написание такого шейпера - задача нетривиальная, сильно зависит от решаемых задач etc и поэтому делать нечто универсальное в этом плане я небуду.
Если можете предложить, как заменить для данного случая imq на ifb, то и предложите, пожалуйста
то что хочешь ты - это как раз попадает под 1) и существующий шейпер с этим прекрасно справляется (за исключением дропа входящего от клиента)... ну а хочешь через ж@пу... пожалуйста - тогда тебе нада трафик входящий на внешний ифейс редиректить на ифб и шейпить там

Ответить