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

проблемы с шейпером

После долгих изучений данного форума удалось поднять следующую конфигурацию:

 

root@TestServer:/# uname -rms
Linux 2.6.32.28+drm33.13imq1 i686

 

eth0 - провайдер 1 (временно не используется)

eth1 - провайдер 2 (подключение по pppoe)

eth2 - внутрення сеть

 

Инет юзерам раздается по средством pptp подключений. Установлен radius + squid transparent + nat. Скорость шейпится через imq интерфейсы следующими образом:

 

root@TestServer:/# iptables -t mangle -nvxL
Chain PREROUTING (policy ACCEPT 257371872 packets, 148567043931 bytes)
   pkts      bytes target     prot opt in     out     source               destination
 429204 40571952 IMQ        all  --  ppp+   *       0.0.0.0/0           !195.x.x.x       IMQ: todev 0

Chain INPUT (policy ACCEPT 167552178 packets, 89828138499 bytes)
   pkts      bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 89575625 packets, 58695542283 bytes)
   pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 180530469 packets, 136566062795 bytes)
   pkts      bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 269795668 packets, 195212974934 bytes)
   pkts      bytes target     prot opt in     out     source               destination
 619491 687022728 IMQ        all  --  *      ppp+   !195.x.x.x        0.0.0.0/0           IMQ: todev 1

 

root@TestServer:/# grep -v "^#" /etc/init.d/shaper.sh | sed -e '/^$/d'
modprobe imq
ip link set dev imq0 up
tc qdisc del dev imq0 root      2> /dev/null > /dev/null
tc qdisc del dev imq0 ingress   2> /dev/null > /dev/null
tc qdisc add dev imq0 root handle 1: htb default 10 r2q 10
tc class add dev imq0 parent 1: classid 1:1 htb rate 24mbit
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 512kbit ceil 512kbit prio 3
tc qdisc add dev imq0 parent 1:10 handle 10: sfq perturb 15

ip link set dev imq1 up
tc qdisc del dev imq1 root      2> /dev/null > /dev/null
tc qdisc del dev imq1 ingress   2> /dev/null > /dev/null
tc qdisc add dev imq1 root handle 2: htb default 10 r2q 10
tc class add dev imq1 parent 2: classid 2:2 htb rate 24mbit
tc class add dev imq1 parent 2:2 classid 2:10 htb rate 512kbit ceil 512kbit prio 3
tc qdisc add dev imq1 parent 2:10 handle 10: sfq perturb 15

 

root@TestServer:/# grep -v "^#" /etc/ppp/ip-up | sed -e '/^$/d'
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
export PATH
PPP_IFACE="$1"
PPP_TTY="$2"
PPP_SPEED="$3"
PPP_LOCAL="$4"
PPP_REMOTE="$5"
PPP_IPPARAM="$6"
export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM
PPP_TTYNAME=`/usr/bin/basename "$2"`
export PPP_TTYNAME

if [ -f /var/run/radattr.$1 ]
  then
   Download_rate_speed=`/usr/bin/awk  '/Download-rate-speed/ {print $2}'  /var/run/radattr.$1`
   Download_ceil_speed=`/usr/bin/awk  '/Download-ceil-speed/ {print $2}'  /var/run/radattr.$1`
   Upload_rate_speed=`/usr/bin/awk  '/Upload-rate-speed/ {print $2}'  /var/run/radattr.$1`
   Upload_ceil_speed=`/usr/bin/awk  '/Upload-ceil-speed/ {print $2}'  /var/run/radattr.$1`
   Class_speed=`/usr/bin/awk  '/Class-speed/ {print $2}'  /var/run/radattr.$1`

   /sbin/tc class add dev imq1 parent 2:2 classid 2:${Class_speed} htb rate ${Download_rate_speed}kbit ceil ${Download_ceil_speed}kbit burst 40k
   /sbin/tc qdisc add dev imq1 parent 2:${Class_speed} handle ${Class_speed}: sfq perturb 15
   /sbin/tc filter add dev imq1 parent 2: protocol ip prio 5 u32 match ip dst $5 flowid 2:${Class_speed}

   /sbin/tc class add dev imq0 parent 1:1 classid 1:${Class_speed} htb rate ${Upload_rate_speed}kbit ceil ${Upload_ceil_speed}kbit burst 40k
   /sbin/tc qdisc add dev imq0 parent 1:${Class_speed} handle ${Class_speed}: sfq perturb 15
   /sbin/tc filter add dev imq0 parent 1: protocol ip prio 5 u32 match ip src $5 flowid 1:${Class_speed}

fi

if [ -x /etc/ppp/ip-up.local ]; then
 exec /etc/ppp/ip-up.local "$*"
fi

run-parts /etc/ppp/ip-up.d \
 --arg="$1" --arg="$2" --arg="$3" --arg="$4" --arg="$5" --arg="$6"

if [ -e /var/run/ppp-quick ]; then
 rm /var/run/ppp-quick
 wait
 kill $PPPD_PID
fi

 

root@TestServer:/var/log# grep -v "^#" /etc/ppp/ip-down | sed -e '/^$/d'
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
export PATH
PPP_IFACE="$1"
PPP_TTY="$2"
PPP_SPEED="$3"
PPP_LOCAL="$4"
PPP_REMOTE="$5"
PPP_IPPARAM="$6"
export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM

if [ -f /var/run/radattr.$1 ]
  then
   Download_rate_speed=`/usr/bin/awk  '/Download-rate-speed/ {print $2}'  /var/run/radattr.$1`
   Download_ceil_speed=`/usr/bin/awk  '/Download-ceil-speed/ {print $2}'  /var/run/radattr.$1`
   Upload_rate_speed=`/usr/bin/awk  '/Upload-rate-speed/ {print $2}'  /var/run/radattr.$1`
   Upload_ceil_speed=`/usr/bin/awk  '/Upload-ceil-speed/ {print $2}'  /var/run/radattr.$1`
   Class_speed=`/usr/bin/awk  '/Class-speed/ {print $2}'  /var/run/radattr.$1`

   for h in `/sbin/tc filter show dev imq1 | grep ":${Class_speed}" | cut -d" " -f10`;
   do
     /sbin/tc filter del dev imq1 parent 2: protocol ip prio 5 handle $h u32
   done

   /sbin/tc qdisc del dev imq1 parent 2:${Class_speed} handle ${Class_speed}: sfq perturb 15
   /sbin/tc class del dev imq1 parent 2:2 classid 2:${Class_speed} htb rate ${Download_rate_speed}kbit ceil ${Download_ceil_speed}kbit burst 40k

   for h in `/sbin/tc filter show dev imq0 | grep ":${Class_speed}" | cut -d" " -f10`;
   do
     /sbin/tc filter del dev imq0 parent 1: protocol ip prio 5 handle $h u32
   done

   /sbin/tc qdisc del dev imq0 parent 1:${Class_speed} handle ${Class_speed}: sfq perturb 15
   /sbin/tc class del dev imq0 parent 1:1 classid 1:${Class_speed} htb rate ${Upload_rate_speed}kbit ceil ${Upload_ceil_speed}kbit burst 40k

fi

PPP_TTYNAME=`/usr/bin/basename "$2"`
export PPP_TTYNAME

if [ -x /etc/ppp/ip-down.local ]; then
 exec /etc/ppp/ip-down.local "$*"
fi

run-parts /etc/ppp/ip-down.d \
 --arg="$1" --arg="$2" --arg="$3" --arg="$4" --arg="$5" --arg="$6"

 

Все работает вроде бы правильно, и скорость режется как надо. Только временами возникает увеличение пинга на внешние ресурсы до 1500-2000 мс. У меня подозрения на шейпер. Подскажите как выяснить что может давать такую картину. Может где допустил ошибку...

Share this post


Link to post
Share on other sites

Только временами возникает увеличение пинга на внешние ресурсы до 1500-2000 мс. У меня подозрения на шейпер. Подскажите как выяснить что может давать такую картину.

 

банальный оверкоммит в классе дает такую картину

Share this post


Link to post
Share on other sites

банальный оверкоммит в классе дает такую картину

Подскажите пожалуйста из-за чего так происходит - для каждого клиента (ip) я же создаю свой класс

Share this post


Link to post
Share on other sites

Подскажите пожалуйста из-за чего так происходит - для каждого клиента (ip) я же создаю свой класс

 

Ну вы же создаете классы к конечными значениями rate/ceil, вот при привышении этого лимита и возникают задержки отправки пакетов (в терминологии htb кол-во пакетов значительно превышает кол-во токенов, генерируемых для их отправки) с целью выдержать заданное ограничение по скорости. В общем-то это и есть суть механизма шейпирования.

Share this post


Link to post
Share on other sites

т.е. грубо говоря если подключилось 60 человек с грантированной скоростью 512 кб/с, то 512 * 60 = 30 мб/с, а канал у меня 24 мб/с - отсюда и проблемы?.. Тогда нет смысла создавать на каждого клиента свой класс... А с другой стороны если несколько клиентов заворачивать в один класс, то не будет у них гарантированной скорости.

Подскажите пожалуйста как правильно решить тогда мою задачу (каждому пользователю гарантированная скорость в зависимости от должности с возможностью увеличения скорости до определенного предела в случае простоя канала)?

Share this post


Link to post
Share on other sites

Соблюдайте правило - сумма rate дочерних классов не должна превышать rate родительского класса. Тогда в часы максимальной нагрузки, все пользователи гарантированно получат свой rate. А ceil - это будет как раз та самая скорость "до", которую вы будете продавать/раздавать своим юзерам. Плюс, чтобы все это работало нужно ограничить максимальную входящую скорость до 80-90% от той полосы, что вам предоставляет аплинк, тогда очередь пакетов будет у вас, а не у аплинка, который её скорее всего даже не шейпит, а полисит. Ну и самое главное надо помнить, что шейпер чудес творить не умеет и внешних 30 мегабит в 100 подключений по мегабиту не превратит, поэтому, если все совсем грустно - может самое время подумать о расширении канала?

Share this post


Link to post
Share on other sites

Спасибо большое за разъяснения! Если переделать мои скрипты с учетом ваших замечаний - получится такой вариант:

root@TestServer:/# grep -v "^#" /etc/init.d/shaper.sh | sed -e '/^$/d'
modprobe imq
ip link set dev imq0 up
tc qdisc del dev imq0 root      2> /dev/null > /dev/null
tc qdisc del dev imq0 ingress   2> /dev/null > /dev/null
tc qdisc add dev imq0 root handle 1: htb default 10 r2q 10
tc class add dev imq0 parent 1: classid 1:1 htb rate 21mbit (0.9 * 24 мб/с на аплинке)
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 3mbit ceil 5mbit prio 3
tc qdisc add dev imq0 parent 1:10 handle 10: sfq perturb 15
tc class add dev imq0 parent 1:1 classid 1:20 htb rate 7mbit ceil 10mbit prio 4
tc qdisc add dev imq0 parent 1:20 handle 20: sfq perturb 15
tc class add dev imq0 parent 1:1 classid 1:30 htb rate 11mbit ceil 15mbit prio 5
tc qdisc add dev imq0 parent 1:30 handle 30: sfq perturb 15


ip link set dev imq1 up
tc qdisc del dev imq1 root      2> /dev/null > /dev/null
tc qdisc del dev imq1 ingress   2> /dev/null > /dev/null
tc qdisc add dev imq1 root handle 2: htb default 10 r2q 10
tc class add dev imq1 parent 2: classid 2:2 htb rate 21mbit
tc class add dev imq1 parent 2:2 classid 2:10 htb rate 3mbit ceil 5mbit prio 3
tc qdisc add dev imq1 parent 2:10 handle 10: sfq perturb 15
tc class add dev imq1 parent 2:2 classid 2:20 htb rate 7mbit ceil 10mbit prio 4
tc qdisc add dev imq1 parent 2:20 handle 20: sfq perturb 15
tc class add dev imq1 parent 2:2 classid 2:30 htb rate 11mbit ceil 15mbit prio 5
tc qdisc add dev imq1 parent 2:30 handle 30: sfq perturb 15

 

При поднятии ppp интерфейса буду с помощью фильтров назначать юзеру нужный класс скорости (в зависимости от должности). Только возникает еще один вопрос: получается три класса скоростей. Если в 10 классе будет один пользователь, то скорость у него будет гарантированно 3 мб/с. Получается многовато для рабочего, а поставить Rate=512 я не могу, т.к. в пиковые моменты в данном классе может быть до 30 человек... Как возможно решить такую задачу?

Share this post


Link to post
Share on other sites

При поднятии ppp интерфейса буду с помощью фильтров назначать юзеру нужный класс скорости (в зависимости от должности). Только возникает еще один вопрос: получается три класса скоростей. Если в 10 классе будет один пользователь, то скорость у него будет гарантированно 3 мб/с. Получается многовато для рабочего, а поставить Rate=512 я не могу, т.к. в пиковые моменты в данном классе может быть до 30 человек... Как возможно решить такую задачу?

 

Ну если развивать вашу идею, то можно еще ветвление добавить, то есть например к классу 1:10 добавлять дочерние классы для каждого пользователя с rate 100kbit (3mbit/30) и ceil в зависимости от должности. И ceil в родительских классах сделайте 21mbit, чтоб канал не простаивал даже если в сети будут пользователи только одного из классов.

А вообще можно не усложнять и сразу к классу 1:1 прикреплять уже классы юзеров с rate=21/n (где n число юзеров всего) и ceil в зависимости от должности.

Share this post


Link to post
Share on other sites

Спасибо большое за помощь. Посмотрю на поведение сети среди недели - отпишусь по результатам

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
Sign in to follow this