Проблема с tc (iproute2)
Гость 10 февраля, 2012 - 08:55
Здравствуйте!
В конец я уже замучился с классификатором u32, ничего не выходит :( делаю
tc qdisc add dev eth1 root handle 1: htb default 2 r2q 10 tc class add dev eth1 parent 1: classid 1:1 htb rate 5Mbit burst 625000 ceil 5Mbit cburst 625000 tc class add dev eth1 parent 1: classid 1:2 htb rate 500Mbit burst 62500000 ceil 500Mbit cburst 62500000 tc filter add dev eth1 parent 1: protocol ip prio 5 u32 flowid 1:1 match ip dst 192.168.0.1/32
и на последней команде (добавление фильтра) получаю вот такую фигу
RTNETLINK answers: Invalid argument We have an error talking to the kernel
В ядре соответственно собрана поддержка
CONFIG_NET_CLS_U32=y CONFIG_CLS_U32_MARK=y CONFIG_NET_EMATCH_U32=y
Чего не хватает? Подскажите пожалуйста...
»
- Для комментирования войдите или зарегистрируйтесь
.
Другие фильтры, не u32, ранее этой команды создавались?
Конечно. Вот например такое
Конечно.
Вот например такое (кусок из одного моего bash скрипта)
отрабатывает себе молча в тряпочку... Не пойму я никак в чем дело...
.
На похожие грабли мне уже приходилось наступать в 2008г. Пару дней пришлось потратить на то, чтобы понять, в чем дело. Я топик здесь создавал, вот этот, никто не ответил тогда, сам разобрался.
Возможно, проблема в prio - его значение не должно быть одинаково для фильтров разных типов. Поскольку в приведенных примерах prio для fw и u32 разные (0 и 5), я не могу быть уверен, что дело именно в этом. Я не знаю точно, какие фильтры уже были применены перед попыткой дать команду
, но результат поразительно похож...
При выполнении команд
При выполнении команд интерфейс абсолютно чист. Специально убирал все остальное.
.
Перед выполнением этих команд 'tc filter show dev eth1' ничего не выводит?
Выполнялось 'tc qdisc del dev eth1 root'?
И у других устройств все чисто?
Если это действительно так, и с ядром все в порядке, и с iproute2, то тогда "арфы нет - возьмите бубен (с)"...
Да да, конечно. Все абсолютно
Да да, конечно. Все абсолютно чисто. Старые фильтры удалены, новые не добавляются - в ответ tc пишет ругань из первого поста.
У вас так:
У вас так:
Попробуйте так:
Или так:
.
Это без разницы, у меня приведенные ТС команды срабатывают на ура.
Переставлять уже по всякому
Переставлять уже по всякому пробовал, не помогает. Последняя это не про то, fw это решение на основании fwmark из iptables, а мне это не нужно. classid он у меня кстати вообще принимать не хотел ни в какую...
Ну а с чего вы решили что у
Ну а с чего вы решили что у вас есть prio 5 полоса? Из приведенного выше этого не видно. Вы его создайте тогда будет проходить правило фильтрации в корне.
Из того что вы написали у вас доступна prio 1 полоса
.
Не совсем понял, о чем здесь?
Например:
Это выдержка из рабочего скрипта.
Где здесь prio 100 или prio 50 полоса?
Я веду речь о том что prio X
Я веду речь о том что prio X в фильтре это преоретизация трафика в по отношению к трафику направленному в соответствующий класс или дисциплину. Соответственно поскольку правил фильтрации могут быть несколько то и приоретизация здесь бывает необходимой, она как бы делит общую полосу трафика поступающего дальше. Но я не учел что приоритет можно задать любой... Правда в случае с одним фильтром он будет наивысшим по определению.
правила автора правильны. Возможно Вы и alexpro наткнулись совместно но в разное время на одну и ту же багу ядра. Стоит сравнить.
.
Это вовсе не бага. Иначе этой баге уже лет эдак 10 с лишним, а мужики-то и не знают. :)
Приоритеты, конечно же, нужны. Куда уж без них? В принципе, смысл использования tc для большинства - нарезка толстой полосы пропускания на тонкие полоски. Каждому юзеру по одной. В этом случае для каждой полоски совершенно логично выставить одинаковый приоритет, чтобы у всех были равные права в рамках нарезанной скорости, сопоставимо с общей скоростью, естественно. Демократия, так сказать. Хотя, как и любая демократия, она условная, ибо при равном приоритете, первым всегда обслуживается тот фильтр, который добавлен раньше. Но часто бывает, как и во всякой демократии, что имеется "белая кость", которой нужно отдавать самый лакомый кусок. Вот для этих случаев приоритет можно выставить повыше (читай, меньше).
Но, все это хозяйство построено так, что нельзя выставить одинаковое значение приоритета для фильтров одного типа, но разных протоколов, или фильтров одного протокола, но разных типов в пределах одного корневого класса. Мана для tc-filters до сих пор не существует, но зато есть довольно много статей по теме. В то время я не нашел в них ответа на свой вопрос, и полез в ядро. В файле /usr/src/linux/net/sched/cls_api.c есть ответ на вопрос, почему может быть "RTNETLINK answers: Invalid argument". Таких причин не так уж и много, и скорее всего, она именно в описанном в начале текущего абзаца. Если нет, то только бубен и пляски вокруг сервера.
...ммм.... что же мне делать?
...ммм.... что же мне делать? =) SOS, я потерялся =)
UPD: проверил на своей домашней машине, жрет правила и не давится, входит легко как манная каша... Но дома у меня ядро 32 бита, а на той машине, где не работает - 64 бита. Может тут есть загвоздка?
есть еще один момент:
есть еще один момент: абсолютно чистый интерфейс выглядит так:
то есть не pfifo_fast, как оно обычно должно быть... Как то так получается, что в этой системе эта дисциплина используется по умолчанию.
.
eth0 это какая сетевая плата?
У меня то же самое (чистый eth1):
Я думаю, что так происходит из-за того, что девайс eth0 у вас, и eth1 у меня имеет несколько аппаратных очередей передачи. Моя сетевушка - Intel 82576. Аппаратных очередей я настроил две. Не знаю, почему у меня по умолчанию создается аж 16 этих классов. А у вас их вообще 5, что мне совсем непонятно. Или не весь вывод приведен в посте?
Если добавить корневую qdisc htb для устройства, все mq удалятся, останется htb, так что тут все нормально и правильно, и никак не влияет на описанную проблему.
Ну я на всякий случай...
Ну я на всякий случай... просто это единственный роутер, где так. На остальных - дефолтный pfifo_fast. Меня больше другое удивило: pfifo_fast нет в системе. Как ни пытался - ну никак ее не поставить. Потому что ее нет. А сетевая такая
двух портовая встроенная.
.
Эта поддерживает. Проверить легко - надо посмотреть, сколько прерываний она занимает. Хотя, если mq по умолчанию, таки поддерживает. Можно почитать /usr/src/linux/Documentation/networking/multiqueue.txt
Так стало быть, так-таки и нету? (с)
Как же тогда вообще работает tc?
pfifo есть, а pfifo_fast
pfifo есть, а pfifo_fast нету... ну я во всяком случае не нашел :)