LINUX.ORG.RU
ФорумAdmin

ограничение tc filter


1

2

Подскажите существует ли ограничение на кол-во фильтров в tc?
Абонентов около 3К при добавлении фильтров в хеш таблицу где-то после 2,5К записей на каждый новый tc filter add dev eth0 ... выдается ошибка:

RTNETLINK answer: File exists
We have error talking to the kernel

При этом, если удалить определенное кол-во фильтров из любого места скрипта до того места откуда начинает выдавать ошибку, ошибка появляется позже ровно на то кол-во правил которые были удалены, то есть складывается впечатление что существует ограничение на фильтры по кол-ву, а не адресному пространству.

подсети
10.0.0.0/24 10.0.1.0/24 10.0.2.0/24 10.0.3.0/24
10.1.0.0/24 10.1.16.0/24 10.1.32.0/24 10.1.48.0/24
192.168.10.0/24 192.168.12.0/24

/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32
/sbin/tc filter add dev eth0 parent 1:0 handle 100: protocol ip u32 divisor 256
/sbin/tc filter add dev eth0 parent 1:0 handle 101: protocol ip u32 divisor 256
/sbin/tc filter add dev eth0 parent 1:0 handle 192: protocol ip u32 divisor 256
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 800:: match ip src 10.0.0.0/16 hashkey mask 0x000000ff at 12 link 100:
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 800:: match ip src 10.1.0.0/16 hashkey mask 0x000000ff at 12 link 101:
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 800:: match ip src 192.168.0.0/16 hashkey mask 0x000000ff at 12 link 192:

/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:53: match ip src 10.0.0.83 flowid 1:65
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:16: match ip src 10.0.0.22 flowid 1:66
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:35: match ip src 10.0.0.53 flowid 1:67
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:40: match ip src 10.0.0.64 flowid 1:68
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:28: match ip src 10.0.0.40 flowid 1:69
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:3: match ip src 10.0.1.3 flowid 1:6a
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:26: match ip src 10.0.0.38 flowid 1:6b
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:1c: match ip src 10.0.0.28 flowid 1:6c
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:ae: match ip src 10.0.4.174 flowid 1:6e
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:27: match ip src 10.0.0.39 flowid 1:6f
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:29: match ip src 10.0.0.41 flowid 1:70
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:1b: match ip src 10.0.0.27 flowid 1:72
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:ad: match ip src 10.0.4.173 flowid 1:73
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:ef: match ip src 10.0.0.239 flowid 1:74
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:b5: match ip src 10.0.1.181 flowid 1:75
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:ba: match ip src 10.0.1.186 flowid 1:75
...

а hash фильтры нельзя заюзать?

Pinkbyte ★★★★★
()
Ответ на: комментарий от yannails

в старых ядрах - да, существует какое-то ограничение. У меня подобная проблема всплывает уже на 100-200 фильтрах

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

нет повторений нет, скорее всего при достижении максимальной записи перестает инкриментироваться счетчик и остается на значении 2048, поэтому выдает такую ошибку

yannails
() автор топика
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:ef: match ip src 10.0.0.239 flowid 1:74
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:b5: match ip src 10.0.1.181 flowid 1:75
/sbin/tc filter add dev eth0 parent 1:0 protocol ip u32 ht 100:ba: match ip src 10.0.1.186 flowid 1:75

Что-то я не понял, какой логикой вы руководствовались, когда создавали хеш-таблицы, и накой мешать в ней разные подсети + заталкивать разных абонов в один класс.

По хорошему делается следующим образом: на каждую подсеть /24 (или менее) делается таблица и дерево классов, и собссно в эту таблицу добавляются уже фильтры для приоритезации либо тупой фильтр редиректа в нужный класс.

3 интерфейса, по 12 подсетей /24 на каждом, приоритезация внутри класса (если память не подводит, по 4 фильтра на каждую ветку хеш-таблицы) - полет нормальный, проблем нет. Ядро 2.6.35.х

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

Я не волшебник, я только учусь.
Меня наверно сбил с толку пример из LARTC, там как раз как у меня ситуация, хотя создать для каждой подсети /24 свою хеш таблица наверное правильнее - быстрее поиск будет идти.
А логика вот какая:
Поиск по предпоследним 2-ум байтам ip адреса, то есть например адрес 10.0.0.181 по маске 10.0 попадает в хеш таблицу по последним двум байтам, а там ищет среди адресов 10.0.0.181, 10.0.1.181, 10.0.2.181 и 10.0.3.181
Схематически
10.0.X.X -> 10.0.X.181 -> 10.0.0.181
А если по подсетям /24
10.0.0.X -> 10.0.0.181

Разные IP попадают в один класс т.к. просто на одного абонента зарегистрировано 2 IP

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

yannails
() автор топика
Ответ на: комментарий от yannails

Ессно более 2048. Скрипт можете стянуть отсюда: http://leaf.git.sourceforge.net/git/gitweb.cgi?p=leaf/bering-uclibc;a=tree;f=...

То, что кол-во фильтров не уменьшается - собссно ничего удивительного, уменьшается кол-во фильтров, через которые проходит 1 пакет.

NiTr0 ★★★★★
()

к сожалению вопрос так и не решился поменял centos 5.6 x86_64 на gentoo x86_64 с новым ядром, проблема осталась 2048 add filter ....

дальше ошибка

RTNETLINK answer: File exists We have error talking to the kernel

yannails
() автор топика
29 октября 2011 г.
Ответ на: комментарий от yannails

Specify a prio in each 'filter add' line. The SAME prio for each filter. Not specifying any filter won't work, but with a prio you can

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.