Может кто подскажет, какова зависимость кол-ва дропаных пакетов к сетевой активности? например если 100-150 впн соединений пропустить через пкап, насколько много пакетов дропнется?
Возьми ifconfig, посмотри сколько за определенный промежуток времени прошло пакетов через интерфейс (запустив ifconfig дважды, в начале и в конце), сравни с тем, сколько наловилось pcap-ом (или tcpdump>>/dev/null-ом, если только планируешь что-то кодить).
Все сильно зависит от конкретных условий, от производительности железа и пропускной способности сети (с 10GBit оптикой даже самый современный core duo вряд-ли справиться). Так-же это зависит и от того, как долго ты будешь обрабатывать каждый пойманный pcap-ом пакет, что тоже величина непредсказуемая без дополнительной информации.
поскольку точность подобных измерений не велика, рекомендуеться взять промежуток времени побольше -- несколько минут хотя-бы, тогда можно до приемлемого уровня поднять относительную точность подсчета кол-ва прошедших пакетов.
> тут где-то народ предлагал из юзерспейса перейти в кернелспейс. на сколько оправданно? как считаешь?
Если нужно просто как-то обрабатывать данные, и не передавать никому более, -- то может дать существенный выйгрышь в производительности, из-за отсутсвия необходимости копировать данные. В данном случае проще всего будет сделать на базе netfilter-а. Однако, если реализация сделанная в userspace-е будет справляться по производительности (надо уже эксперементировать) то лучше оставаться в userspace-е, - меньше времени на разработку уйдет и меньше геммороя с поддержкой, хотя тут уже все от приоритетов которые у тебя есть и от того, что тебе важнее - время разработки, красота решения, что-то еще, итп..
если только это - то это копейки. А если "на основании полученных из пакета данных что-то где-то посчитать, что-то где-то учесть (допустим в мапе найти запись и увеличить значение на 1)" -- это уже гораздо накладнее.
дело в том что я сделал набросок в виде программы которая снифит ppp ифейс и тупо выводит tcp|udp|icmp|other srcip:port dstip:port size на одном ифейсе робит, не дропает :) но млин уже начитался страстей про дропание и боюсь в продакшн такой механизм вживлять. точнее реализовывать на базе такого подхода ибо потом если упрусь в грабли, то переделывать будет шипко дорого (.
Используя ядреный модуль и netfilter можно полностью исключить возможность дропа, т.к. пока ты не спроцессиш пакет, он дальше не пойдет, т.е. будет тормозить, но пропускать не будет ;)
Если дропы так фатальны - можно тогда и в ядре сделать все. Однако лишний код в ядре, на продакшене - тоже не всегда желателен ;)
P.S. Я думаю в твоей тестовой утилите, большую часть времени тратит printf или кого ты там используешь ;)
ну это понятно что в моем тестовом случает вообще не показательны какие-либо измерения ;) то что вывод это боооольшой тормоз я знаю :). но я ведь в процессе работы не буду юзать принтф, только агрегация и слив в файл. тобишь сведу к минимуму IO.