stelsik Опубликовано 14 апреля, 2009 (изменено) Проблемато небольшая нужно шейпить исходящий траффик на 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" Изменено 14 апреля, 2009 пользователем stelsik Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
micros Опубликовано 14 апреля, 2009 уверен по коду ошибки в гугле много интересного. И если пишет "is big" - мобыть он действительно слишком big? ;) а зачем такое большое значение id? (10000) у вас такое количество ppp интерфейсов? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
stelsik Опубликовано 14 апреля, 2009 Я тоже уверен что по коду ошибки в гугле много чего интересного, к делу, отношение имеет косвенное, так как ошибка в построении классов. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
micros Опубликовано 14 апреля, 2009 (изменено) Не вижу там нигде 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 както так. когда вылезет ошибка - ее легче будет найти по номеру строки. Изменено 14 апреля, 2009 пользователем micros Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
stelsik Опубликовано 14 апреля, 2009 micros спасибо за замечания поправил немного Вот так он пишет quantum of class 10001 is big. Consider r2q changeМожет всетаки этот quantum уменьшить, хотя в манах вроде написано что наоборот увеличивать надо Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
micros Опубликовано 14 апреля, 2009 так там про 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? уберите его, пусть дефолтовым будет. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
stelsik Опубликовано 14 апреля, 2009 Я тут покапал вот что нашел 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 а более Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
micros Опубликовано 14 апреля, 2009 да. или убрать этот параметр, и он посчитается автоматически ;0) quantum = rate / r2q следуя правилу, не уходить от quantum 1500, я бы считал r2q зная quantum и рейт. вы либо оставьте quantum и рейт и не указывайте r2q (я так делаю, и видел множество примеров), либо укажите рейт и r2q, а quantum не трогайте. В любом случае r2q - это сумма для всех классов, если у вас после запуска шейпера создаются еще классы, берите r2q с запасом. П.С. если quantum будет отличаться от МТУ по-моему получиться фрагментация пакетов. что не есть хорошо (может что и путаю, но где то читал) пробуйте. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
technolab Опубликовано 27 апреля, 2011 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 - юзайте константы и будет вам счастье. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
technolab Опубликовано 27 апреля, 2011 для примера на канал 900 мегабит $TC->("qdisc add dev $dev root handle 1: htb r2q 37500"); автоматом будет посчитан quantum = 3000 ровно таким же макаром нужно считать для дочек Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Dimka88 Опубликовано 6 апреля, 2018 В 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; } Может кому пригодится. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kayot Опубликовано 7 апреля, 2018 Для современных скоростей можно и нужно сразу задавать quantum=200000. Но к теме это отношения не имеет никакого, данные сообщения на работу HTB не влияют. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...