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

Помогите с шейпером в линукс HTB TC

Проблемато небольшая нужно шейпить исходящий траффик на ppp интерфейсах, вроде все сделал правильно, и даже все работает, но HTB ругается благим матом на меня

 

            /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1
            /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate 25mbit burst 256k
            /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit burst 256k prio 1
            /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit burst 256k prio 2
            /sbin/tc class add dev $1 parent 1:1 classid 1:30 htb rate 20mbit burst 512k 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 qdisc add dev $1 parent 1:30 handle 30: sfq perturb 10 quantum 1500
            /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip src net/pref flowid 1:30
            /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

По сути нужно дать полосу для выделенной сетки одну, а в интернет другую как на ${UPSPEED}

Ругается на класс 10001 и 10030 что они "is big"

Edited by stelsik

Share this post


Link to post
Share on other sites

уверен по коду ошибки в гугле много интересного.

И если пишет "is big" - мобыть он действительно слишком big? ;)

а зачем такое большое значение id? (10000) у вас такое количество ppp интерфейсов?

Share this post


Link to post
Share on other sites

Я тоже уверен что по коду ошибки в гугле много чего интересного, к делу, отношение имеет косвенное, так как ошибка в построении классов.

Share this post


Link to post
Share on other sites

Не вижу там нигде 10001 и т.д. разве что закралась пара мелочей

вот в этой строке.

/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

 

match u8 0x10 0xff at 33
Насколько знаю я - длина заголовка айпи пакета = 32 байт и У32 может анализировать только его. (честно, не интересовался пока на предмет анализа всего пакета)

 

u160x0000
здесь наверно пробел нужно поставить :) , ну это если вы копировали.

 

ИМХО если фильтр сложный и имеет несколько классификаторов - легче записать в несколько строк.

 

/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

 

както так.

когда вылезет ошибка - ее легче будет найти по номеру строки.

Edited by micros

Share this post


Link to post
Share on other sites

micros спасибо за замечания поправил немного

Вот так он пишет

quantum of class 10001 is big. Consider r2q change
Может всетаки этот quantum уменьшить, хотя в манах вроде написано что наоборот увеличивать надо

Share this post


Link to post
Share on other sites

так там про quantum ругательства, а не про класс.

насколько я знаю, quantum, должен быть равен mtu. а это 1500

 

quantum

 

Amount of bytes a stream is allowed to dequeue before the next queue gets a turn. Defaults to 1 maximum sized packet (MTU-sized). Do not set below the MTU!

У вас случаем не стоит нигде больше этого значения? например вон в том классе, где ругается?

 

параметр R2Q используется для квантования трафика в

классах. В случае малых скоростей рекомендуется значение = 1, что

позволяет шейпить с точностью до 4kbit. Если не указан, то =10,

что для скоростей >120Kbit.

http://www.opennet.ru/base/net/htb_saga.txt.html

 

у вас же не мизерные скорости, наверняка тарифы начинаются от 128? уберите его, пусть дефолтовым будет.

 

 

Share this post


Link to post
Share on other sites

Я тут покапал вот что нашел

Changing burst will not remove the warning. r2q is "rate to quantum" is used

to calculate the quantum for each class : quantum = rate / r2q. Quantum must

be 1500 < quantum < 60000. Otherwise you will get warnings from the kernel.

Solution : choose r2q so for each class 1500 < quantum < 60000

Or choose the best r2q you can and specify the quantum manually if you add a

class.

Получается r2q надо увеличивать и явно не до 10 а более

Share this post


Link to post
Share on other sites

да. или убрать этот параметр, и он посчитается автоматически ;0)

 

quantum = rate / r2q

следуя правилу, не уходить от quantum 1500, я бы считал r2q зная quantum и рейт.

 

вы либо оставьте quantum и рейт и не указывайте r2q (я так делаю, и видел множество примеров), либо укажите рейт и r2q, а quantum не трогайте.

В любом случае r2q - это сумма для всех классов, если у вас после запуска шейпера создаются еще классы, берите r2q с запасом.

 

П.С. если quantum будет отличаться от МТУ по-моему получиться фрагментация пакетов. что не есть хорошо (может что и путаю, но где то читал)

пробуйте.

 

 

 

Share this post


Link to post
Share on other sites

MTU - максимальный размера блока в байтах который может быть передан.

Quantum - число байт, которые может передать поток перед переходом к следующему классу, по умолчанию = MTU интерфейса. Расчет распределения канала тем точнее, чем меньше это значение.

R2Q - глобальный параметр, по умолчанию R2Q = 10, если Quantum указан, то R2Q игнорируется.

 

Немного констант:

quantum = rate / r2q

mtu ≤ quantum ≤ 60000

 

Соответственно:

quantum is small => RATE / R2Q < MTU

quantum is big => RATE / R2Q > 60000

 

Во избежании фрагментации, вероятно, quantum лучше задавать кратным значению mtu

 

А вообще, если quantum не задавать, то он будет расчитан автоматически. Правда следует определиться со значением R2Q - юзайте константы и будет вам счастье.

Share this post


Link to post
Share on other sites

для примера на канал 900 мегабит

$TC->("qdisc add dev $dev root handle 1: htb r2q 37500");

автоматом будет посчитан quantum = 3000

 

ровно таким же макаром нужно считать для дочек

Share this post


Link to post
Share on other sites
В 27.04.2011 в 22:19, technolab сказал:

Соответственно:

quantum is small => RATE / R2Q < MTU

quantum is big => RATE / R2Q > 60000

В чате проекта accel-ppp.org завели дискуссию о шейпере, конкретнее о сообщениях.

Цитата

HTB: quantum of class 16AC4 is big. Consider r2q change

Сразу вспомнилась эта тема и статья в интернете с которой эта тема линкуется, ну и собственно значения, которыми руководствовался RATE / R2Q > 60000

В исходниках ядра есть sch_htb.c и собственно там следующие значения. quantum < 1000 - is small  и quantum > 200000 - is big

int rate2quantum;  /* quant = rate / rate2quantum */

...

if (!hopt->quantum && cl->quantum < 1000) {
			printk(KERN_WARNING
			       "HTB: quantum of class %X is small. Consider r2q change.\n",
			       cl->common.classid);
			cl->quantum = 1000;
		}
  
...
 
if (!hopt->quantum && cl->quantum > 200000) {
			printk(KERN_WARNING
			       "HTB: quantum of class %X is big. Consider r2q change.\n",
			       cl->common.classid);
			cl->quantum = 200000;
		}

Может кому пригодится.

Share this post


Link to post
Share on other sites

Для современных скоростей можно и нужно сразу задавать quantum=200000.

Но к теме это отношения не имеет никакого, данные сообщения на работу HTB не влияют.

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