![]() |
|
Модераторы: feodorv |
![]()
|
|
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
всем привет!
надо согласно исходный сетей раскидать пакеты по vlan список сетей приводим к uint32_t и загоняем в массив по принцыпу lower[] upper[] что соответсвует нижней и верхней границы сети потом в цыкле определяем принадлежность ип к сети :
проблема в следуещем , когда загружаеш в массив сетей ну хотя бы ua-ix (19000 сетей) получается что каждый пакет надо прогнать по 19000 элементам массива что очень тормозит работу програмы на практике выяснил что такой алгоритм поиска не выдерживает более 42000 - 43000 входящий пакетов в секунду даже при работе в 8 треадов подскажите более быстрый алгоритм Это сообщение отредактировал(а) box - 12.5.2014, 00:44 |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Самое, пожалуй, быстрое -- построить perfect hash function.
Впрочем, возможно, что ты в этой математике закопаешься -- тогда можно просто hash, дажэ очень тупой (типа два средних байта номера сети), примерно в два размера таблички. Или взять btree или какой-нибудь вариант trie (их сейчас можно найти сделанными на макросах, вполне эффективные) -- реализацыя будет во-первых довольно эффективной на любых размерах массива (в варианте с hash -- только примерно соответствующем первоначальному предположэнию), кроме того, trie обычно компактнее, что, например, позволит влезть всей структуре в L2 cache. PS А, да, про cache: ещё, размеется, батчинг: постарайся проводить этот поиск для множэства пакетов подряд. Чтобы твои данные про сети висели таки в кэшах во время работы алгоритма. Т.е. накапливаешь тысячу или десяток тысяч пакетов -- и потОм распределяешь. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Аналог mod_geoip? Конечно, дерево, последовательный перебор слишком затратный. Насколько я помню, в mod_geoip используется специфическое дерево интервалов.
Но если у Вас все подсети имеют "правильный" вид (то есть с масками вида /20, /24 ...), то можно обойтись простым бинарным деревом, максимальное количество сравнений тогда будет не более 30. Правда, нужно будет учесть, что для конкретного IP нужно будет выбирать как можно узкую подсеть (с максимальной маской). -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| box |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 506 Регистрация: 27.2.2007 Репутация: нет Всего: 0 |
речь идет о 10g ethernet а именно о 14млн пакетов в сек так что тут ни дерево ни какие хаши боюсь не справятся , надо будет попробовать перенести поиск по сетям на cuda
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 1 Всего: 106 |
Думаю, Вы не до конца понимаете, что дают Вам деревья. Feodorv, в таком случае даже преувеличил число сравнений для поиска: на 14млн пакетов будет порядка 7 сравнений на поиск. Конечно, я имею ввиду сбалансированные деревья и бинарный поиск. Посмотрите вот для примера: http://ru.wikipedia.org/wiki/Красно-чёрное_дерево . -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
А если Вы сами всё так хорошо знаете -- то зачем здесь что-то спрашываете? |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |