производительность — самый быстрый способ чтения необработанных данных из интерфейса Stack Overflow

Вот главная проблема.

  1. У меня 10-гигабитный интерфейс Ethernet, и ток составляет 6-7 Гбит / с
  2. Мне нужно реализовать брандмауэр. Затем мне нужно перехватить необработанные пакеты для фильтрации некоторых пакетов.
  3. Просто я начал реализовывать в виде необработанного сокета необходимые коды ниже. Сокет привязан к определенному интерфейсу.

    socketfd=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
    strncpy(ifopts.ifr_name,interfaceName,IFNAMSIZ-1);
    ioctl(socketfd,SIOCGIFINDEX,&ifopts);
    sll.sll_family=AF_INET;
    sll.sll_ifindex=ifopts.ifr_ifindex;
    sll.sll_protocol=htons(ETH_PALL);
    bind(socketfd,&sll,sizeof(sll));
    
  4. Вот как я читаю и размер mtu составляет 9000

    while(true)
    recvfrom(socketfd,buffer,9000,0,0,0);
    
  5. Без какого-либо процесса на пакете я получил ~ 150 Мбит / с.

Это проблема, которую мне нужно решить. Я понимаю, что ссылка nload или ip -s показывает фактическую скорость; но я не могу достичь этих цифр около 6-7 Гбит / с.

~ 150 Мбит / с — это очень смешная скорость для меня. Мне нужно увеличить производительность настолько, насколько я могу сделать, используя один процессор. Я постараюсь использовать PF_INET, если вы хотите, я могу поделиться результатом этого.

0

Решение

Вот ответ.

  • Прежде всего, скорость захвата зависит не только от размера байтов на интерфейсе, но и от количества пакетов. Таким образом, программирование сокетов также ограничено количеством пакетов. Я измерял как 200k пакетов в секунду (pps).
  • Использование лучшего сетевого драйвера — один из способов увеличения числа pps. PF_RING — это возможная библиотека и драйвер. Вы можете использовать пробную версию для тестирования. Я просто тестирую его в своей сети, и результат составляет 14 млн. Pps. Тогда эта скорость почти 10 Гбит / с. Это все, что я испытал.

Спасибо всем.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]