реализовал представленое по ссылке
https://www.opennet.ru/base/dev/traffic_analyze.txt.
c маленькими изменениями
грубо говоря фиксирует объемы входящего трафика на каждую подсеть
раз в секунду отправляет данные на другую машину.do {
rec = recvfrom(eth0_if, (__u8 *)buff, ifp.mtu + 18, 0, NULL, NULL);
if(rec < 0 || rec > ETH_FRAME_LEN) {
perror("recvfrom\n");
return -1;
}
eth=buff;
ip=buff + ETH_HLEN;
__u8 net;
net=(__u8)((ip->daddr & 0x00fe0000)>>16);
counter_net[net]+=rec;
}
counter_proto[ip->protocol]++;
t=time(NULL);
et=t;
counter_net[256]=0;
counter_proto[256]=1;
counter_packet_size[256]=2;
counter_packet_size[(rec>>6)&0x00ff]++;
int i=0;
for (i=0;i<256;i++){
counter_net=0;
counter_proto=0;
counter_packet_size=0;
}
}
}
} while(1);
проблема в том, что это я запускаю на гигабитном интерфейсе и данный цикл грузит проц на 90-95 процентов
как окозалось, даже вот такое упрощение
do {
rec = recvfrom(eth0_if, (__u8 *)buff, ifp.mtu + 18, 0, NULL, NULL);
if(rec < 0 || rec > ETH_FRAME_LEN) {
perror("recvfrom\n");
return -1;
}
} while(1);
грузит проц на 80%
зато iptables на 3000 правил, практически не грузит процессор, хотя через него пролетает гигабит/с в обоих направлениях
шейпер с использованием хеша, также не грузит
ктонибудь подскажет как реализовать более производительную схему?
обрабатывать мне нужно каждый пакет проходящий через интерфейс
ЗЫ: и ipcad грузит процесор поменьше