Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> router 
:(
    Опции темы
box
Дата 12.5.2014, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



всем привет!
надо согласно исходный сетей раскидать пакеты по vlan 
список сетей приводим к uint32_t и загоняем в массив по принцыпу lower[] upper[] что соответсвует нижней и верхней границы сети потом в цыкле определяем принадлежность ип к сети :
Код

  uint32_t ipint = IPToUInt(new_ip);
  for(int i=0; i < 19000; i++){
  targ->flag = 0;
  if( ipint >= lower[i] ){
    if( ipint <= upper[i] ){

    uint32_t lower1 = lower[i];   
    uint32_t upper1 = upper[i];
  
    if(lower1 > 0 && upper1 > 0){
        targ->count_ua_true++;    
        targ->flag = 1;
        break;
        }
    }
}

}

 if(targ->flag == 0)    
        targ->count_ua_false++;    


проблема в следуещем , когда загружаеш в массив сетей ну хотя бы ua-ix (19000 сетей) получается что каждый пакет надо прогнать по 19000 элементам массива что очень тормозит работу програмы на практике выяснил что такой алгоритм поиска не выдерживает более 42000 - 43000 входящий пакетов в секунду даже при работе в 8 треадов 
подскажите более быстрый алгоритм 

Это сообщение отредактировал(а) box - 12.5.2014, 00:44
PM MAIL   Вверх
tzirechnoy
Дата 12.5.2014, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Самое, пожалуй, быстрое -- построить perfect hash function. 
Впрочем, возможно, что ты в этой математике закопаешься -- тогда можно просто hash, дажэ очень тупой (типа два средних байта номера сети), примерно в два размера таблички. 

Или взять btree или какой-нибудь вариант trie (их сейчас можно найти сделанными на макросах, вполне эффективные) -- реализацыя будет во-первых довольно эффективной на любых размерах массива (в варианте с hash -- только примерно соответствующем первоначальному предположэнию), кроме того, trie обычно компактнее, что, например, позволит влезть всей структуре в L2 cache.

PS А, да, про cache: ещё, размеется, батчинг: постарайся проводить этот поиск для множэства пакетов подряд. Чтобы твои данные про сети висели таки в кэшах во время работы алгоритма. Т.е. накапливаешь тысячу или десяток тысяч пакетов -- и потОм распределяешь.
PM MAIL   Вверх
feodorv
Дата 12.5.2014, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Аналог mod_geoip? Конечно, дерево, последовательный перебор слишком затратный. Насколько я помню, в mod_geoip используется специфическое дерево интервалов.

Но если у Вас все подсети имеют "правильный" вид (то есть с масками вида /20, /24 ...), то можно обойтись простым бинарным деревом, максимальное количество сравнений тогда будет не более 30. Правда, нужно будет учесть, что для конкретного IP нужно будет выбирать как можно узкую подсеть (с максимальной маской).


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 12.5.2014, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



речь идет о 10g ethernet а именно о 14млн пакетов в сек так что тут ни дерево ни какие хаши боюсь не справятся , надо будет попробовать перенести поиск по сетям на cuda
PM MAIL   Вверх
GremlinProg
Дата 13.5.2014, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



Цитата(box @  13.5.2014,  00:03 Найти цитируемый пост)
речь идет о 10g ethernet а именно о 14млн пакетов в сек так что тут ни дерево ни какие хаши боюсь не справятся

Думаю, Вы не до конца понимаете, что дают Вам деревья. Feodorv, в таком случае даже преувеличил число сравнений для поиска: на 14млн пакетов будет порядка 7 сравнений на поиск. Конечно, я имею ввиду сбалансированные деревья и бинарный поиск. Посмотрите вот для примера: http://ru.wikipedia.org/wiki/Красно-чёрное_дерево .


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
tzirechnoy
Дата 13.5.2014, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
речь идет о 10g ethernet а именно о 14млн пакетов в сек так что тут ни дерево ни какие хаши боюсь не справятся , надо будет попробовать перенести поиск по сетям на cuda


А если Вы сами всё так хорошо знаете -- то зачем здесь что-то спрашываете?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.