Здравствуйте.Когда-то, в 90-х, я увлекался программирование. Что бы не делать перегибов в какую либо сторону скажу что программером я был самым обычным. И вот спустя больше 10 лет. Пришлось вспоминать С.
Теперь к сути дела. Пишу программу которая анализирует SCCP траффик. Все как бы хорошо, но программа теряет пакеты. Сначала я думал что это проблема ИОС циски, что не все пакеты отсылает. Смена ИОСа ничего не дала. Потом я начал оптимизировать код, искать где бы я мог накосячить, плюс искал обходные пути как бы можно было очень интелектуально определять потерю пакета и восстанавливать нормальных ход событий. Результата не принесло. Потом я начал искать в гугуле и обнаружил что это частая проблема когда libpcap теряет пакеты при интенсивном трафике. Разработка ведется на FreeBSD под ней же программка и работает. Из того что мне удалось найти в интернете и попробовать реализовать у себя:
1) Включил в ядре DEVICE_POLLING. На интерфейсе он появился.
2) Реализовал в программе возможность повышения приоритета (realtime scheduling)
3) сделал многопоточность (pthread_create)
4) сделал так, что захваченый пакет просто ложится в память для дальнейшей обработки. Тоесть операция принятия пакета и его сохранения должна проходить моментально так как работа идет с памятью. А дальше потоки уже по мере возможностей записывают даныне в базу.
5) Обновил библиотеку libpcap до последней на момент написания этого поста. Перекомпилил программу. В инете встречал упоминание про какой-то афигенный патч к libpcap. Сам патч не нашел, а вот обновил библотеку в надежде что там уже все последние патчи учтены.
6) делал renice плюс к пункту 2.Пока наблюдаю за последствиями 5 пунктка, но все остальные усилия результата не принесли. Программа теряет пакеты.
Из того что могу еще сделать остается попробовать поставить прогу на комп с процессором не ниже интела i5. Может быстродействие самого железа решит проблему. Но вот прямо сейчас такой возможности нет.
Посоветуйте что еще можно сделать?
Что-то мне не удалось найти в ядре FreeBSD упоминание о MMAP, хотя говорят что MMAP помогает. Все упоминания преимущественно касаются линукс+MMAP.
Спасибо.
>[оверквотинг удален]
> 6) делал renice плюс к пункту 2.
> Пока наблюдаю за последствиями 5 пунктка, но все остальные усилия результата не
> принесли. Программа теряет пакеты.
> Из того что могу еще сделать остается попробовать поставить прогу на комп
> с процессором не ниже интела i5. Может быстродействие самого железа решит
> проблему. Но вот прямо сейчас такой возможности нет.
> Посоветуйте что еще можно сделать?
> Что-то мне не удалось найти в ядре FreeBSD упоминание о MMAP, хотя
> говорят что MMAP помогает. Все упоминания преимущественно касаются линукс+MMAP.
> Спасибо.под FreeSBD есть замечательный framework -- называется netgraph, вот под него и надо писать -- не под libpcap. http://subnets.ru/blog/?p=1766 как вариант
> под FreeSBD есть замечательный framework -- называется netgraph, вот под него и
> надо писать -- не под libpcap. http://subnets.ru/blog/?p=1766 как вариантне совсем понял. Надо написать свой модуль netgraph или с помощью netgraph создать интерфейс который и слушать через pcap
>> под FreeSBD есть замечательный framework -- называется netgraph, вот под него и
>> надо писать -- не под libpcap. http://subnets.ru/blog/?p=1766 как вариант
> не совсем понял. Надо написать свой модуль netgraph или с помощью netgraph
> создать интерфейс который и слушать через pcapоба варианты вполне возможны
1. для ядра писать будет немного дольше и сложнее
2. netgraph может выплюнуть в socket, соответственно с определёнными фильтрами и/или копированием пакетов, а дальше уже дело техники.google + netgraph + tee + socket
>>> под FreeSBD есть замечательный framework -- называется netgraph, вот под него и
>>> надо писать -- не под libpcap. http://subnets.ru/blog/?p=1766 как вариант
>> не совсем понял. Надо написать свой модуль netgraph или с помощью netgraph
>> создать интерфейс который и слушать через pcap
> оба варианты вполне возможны
> 1. для ядра писать будет немного дольше и сложнее
> 2. netgraph может выплюнуть в socket, соответственно с определёнными фильтрами и/или копированием
> пакетов, а дальше уже дело техники.
> google + netgraph + tee + socketну что ж.... создал интерфейс ngeth0 он колн интерфейса где идет весь нужный траффик.
посмотрим что будет. :)
> ну что ж.... создал интерфейс ngeth0 он колн интерфейса где идет весь
> нужный траффик.
> посмотрим что будет. :)пока решил так попробовать. А вдруг.
>> ну что ж.... создал интерфейс ngeth0 он колн интерфейса где идет весь
>> нужный траффик.
>> посмотрим что будет. :)
> пока решил так попробовать. А вдруг.т.е. склонировал интерфейс и по старому на нём pcap'ом слушать??? -- no way
>>> ну что ж.... создал интерфейс ngeth0 он колн интерфейса где идет весь
>>> нужный траффик.
>>> посмотрим что будет. :)
>> пока решил так попробовать. А вдруг.
> т.е. склонировал интерфейс и по старому на нём pcap'ом слушать??? -- no
> wayК сожалению это так. На этот клонированый интерфейс валит только бродкаст. Полезного трафка нет.
Насколько я понимаю суть потери этих пакетов, то потеря происходит после того как пакет пришел на сетевушку, поступил в ядро, ядро положило в буфер. Даже если я сделаю это через сокет всеравно в конечном итоге будет задействован сетевой функционал с этим же буфером. Тоесть проблема не решиться. А вот если написать свой нетграф модуль тогда..... Я буду уже в ядре даже до фаервола получать пакеты. Но как не печально мой уровень скорее всего не позволит написать нетграф модуль.
>[оверквотинг удален]
>> way
> К сожалению это так. На этот клонированый интерфейс валит только бродкаст. Полезного
> трафка нет.
> Насколько я понимаю суть потери этих пакетов, то потеря происходит после того
> как пакет пришел на сетевушку, поступил в ядро, ядро положило в
> буфер. Даже если я сделаю это через сокет всеравно в конечном
> итоге будет задействован сетевой функционал с этим же буфером. Тоесть проблема
> не решиться. А вот если написать свой нетграф модуль тогда..... Я
> буду уже в ядре даже до фаервола получать пакеты. Но как
> не печально мой уровень скорее всего не позволит написать нетграф модуль.а udp socket написать сможешь? если да -- то ещё раз в гугл до просветления... хотя может проснётся пресловутое FreeBSD комьюнити и распишет тебе всё что нужно... я к оным слава господи не отношусь
>[оверквотинг удален]
>> Насколько я понимаю суть потери этих пакетов, то потеря происходит после того
>> как пакет пришел на сетевушку, поступил в ядро, ядро положило в
>> буфер. Даже если я сделаю это через сокет всеравно в конечном
>> итоге будет задействован сетевой функционал с этим же буфером. Тоесть проблема
>> не решиться. А вот если написать свой нетграф модуль тогда..... Я
>> буду уже в ядре даже до фаервола получать пакеты. Но как
>> не печально мой уровень скорее всего не позволит написать нетграф модуль.
> а udp socket написать сможешь? если да -- то ещё раз в
> гугл до просветления... хотя может проснётся пресловутое FreeBSD комьюнити и распишет
> тебе всё что нужно... я к оным слава господи не отношусьUDP смогу. Это без проблем.
Ну ладно, а если это будет линукс. Что можно сделать на нем и без сокетов.
Линукс поставить как два байта переслать. Если с БСД глухой угол - поставлю линукс.
>>[оверквотинг удален]
>>> Насколько я понимаю суть потери этих пакетов, то потеря происходит после того
>>> как пакет пришел на сетевушку, поступил в ядро, ядро положило в буфер.Ну дык правильно! И что же тебе надо? Если пакет лежит в буфере - он потерян?
> Линукс поставить как два байта переслать. Если с БСД глухой угол - поставлю линукс.
А давай! Я думаю будет всё тоже :)
> Ну дык правильно! И что же тебе надо? Если пакет лежит в
> буфере - он потерян?буфер имеет свойство переполняться и тогда пакеты будут просто дропаться.
а еще я читал что ядро не гарантирует доставку пакеты к работающему приложению. Тоесть это свойство самой системы.
Чё то чем дальше в лес ...
А ты раз уж libpcap есть не пробовал тупо tcpdump'ом тот же траффик понюхать?
Если оно ловит, значит проблема в твоём костыле. Ясновидящие в отпуске а ты не уточнял что и как ты делаешь. Но надеюсь ты экзамплы внимательно читал и собирал - если нет вначале почитай собери. Потом и свой костыль поправишь. Как то так.PS: Под Linux то заработало или всё то же?
> Чё то чем дальше в лес ...
> А ты раз уж libpcap есть не пробовал тупо tcpdump'ом тот же
> траффик понюхать?потеря пакетов случается раз 2-5 часов. поэтому tcpdump пока даже не пробовал включать
> Если оно ловит, значит проблема в твоём костыле. Ясновидящие в отпуске а
> ты не уточнял что и как ты делаешь.а никто и не интересовался что и как я делаю. раз дают советы значит понимают о чем речь :)
> экзамплы внимательно читал и собирал - если нет вначале почитай собери.
> Потом и свой костыль поправишь. Как то так.совет какой-то не жизнеспособный.