Подтвердить что ты не робот

Libpcap для захвата сетевой карты 10 Гбит/с

Я хочу захватить пакеты с сетевой карты 10 Гбит/с с потерей пакетов. Я использую lipcap для сетевого адаптера 100 Мбит/с, и он работает нормально. Будет ли libpcap иметь возможность обрабатывать трафик NIC 10 Гбит/с? Если нет, то каковы другие альтернативные способы достижения этого?

4b9b3361

Ответ 1

Независимо от того, будет ли libpcap обрабатывать 10 Гбит/с с потерей пакетов 0, это вопрос машины, которую вы используете, и версии libpcap. Если машина, процессор и жесткий диск ввода-вывода достаточно быстр, вы можете получить 0 потери пакетов. В противном случае вам может потребоваться выполнить следующие действия:

  • Обновите свой libpcap до последней версии. Libpcap 1.0.0 или новее, механизм supposts с нулевой копией (память). Это означает, что есть буфер, который как в адресном пространстве ядра, так и в адресном пространстве приложения, так что данные не нужно копировать из буфера режима ядра в буфер пользовательского режима. Пакеты все еще копируются из skbuff (Linux) в общий буфер, поэтому он больше похож на "один экземпляр", но еще меньше копий, что позволяет сократить время процессора, необходимое для приема захваченных пакетов. Кроме того, из буфера для каждого пробуждающегося вызова приложения можно извлечь больше пакетов.

  • Если вы наблюдаете высокую загрузку процессора, возможно, ваш процессор не может обрабатывать скорость прибытия пакета. Вы можете использовать xosview (средство визуализации загрузки системы), чтобы проверить ресурсы вашей системы во время захвата.

  • Если процессор откачивает пакеты, вы можете использовать PF_RING. PF_RING является расширением libpcap с круговым буфером: http://www.ntop.org/products/pf_ring/. Это намного быстрее и может захватывать 10 Гбит/с с сетевыми сетевыми адаптерами http://www.ntop.org/products/pf_ring/hardware-packet-filtering/.

  • Еще один подход - получить сетевой адаптер, который имеет встроенную память и конкретный дизайн HW для захвата пакетов, см. http://en.wikipedia.org/wiki/DAG_Technology. p >

  • Если процессор больше не является вашей проблемой, вам нужно проверить скорость передачи данных на диске. hdparm - самый простой инструмент для Linux. Некоторые дистрибутивы поставляются с графическим интерфейсом, в противном случае: $ sudo hdparm -tT /dev/hda

Если вы разрабатываете собственное приложение на основе libpcap:

  • Использовать pcap_stats для идентификации (а) количества отброшенных пакетов, поскольку в них не было места в буфере операционной системы, поскольку пакеты не читались достаточно быстро; (b) количество пакетов, отбрасываемых сетевым интерфейсом или его драйвером.

  • Libpcap 1.0.0 имеет API, который позволяет приложению устанавливать размер буфера на платформах, где можно задать размер буфера. b) Если вам сложно установить буфер, вы можете использовать Libpcap 1.1.0 или новее, в котором размер буфера захвата по умолчанию увеличен с 32K до 512K. c) Если вы просто используете tcpdump, используйте 4.0.0 или новее и используйте флаг -B для размера буфера

Ответ 2

Вы не говорите, какая операционная система или процессор. Неважно, выбираете ли вы libpcap или нет, базовая производительность сети все еще обременена операционным управлением памятью и сетевым драйвером. libpcap не отстает от шагов и может обрабатывать 10 Гбит/с, но там больше.

Если вам нужен лучший процессор, чтобы вы могли выполнять хэширование номеров, запускать виртуальные машины и захватывать пакеты, переходите к процессору AMD Opteron, который по-прежнему превосходит Intel Xeon Quadcore 5540 2,53 ГГц (несмотря на внедрение Intel XIO/DDIO и в основном потому, что двухъядерного совместного использования Intel одного и того же кэша L2). Для лучшей готовой ОС перейдите с последней версией FreeBSD as-is (которая по-прежнему превосходит возможности Linux 3.10, используя базовое оборудование.) В противном случае Intel и Linux будут прекрасно работать для базового захвата 10Gbps без потерь, при условии, что вы готовы свернуть ваши рукава.

Если вы все время нажимаете на головокружительную скорость, делая финансовую или стохастическую или крупномасштабную интеллектуальную вычислительную хрустку (или что-то еще), затем читайте...

Поскольку RedHat имеет обнаружен, 67,2 наносекунды - это то, что требуется для обработки одного пакета минимального размера со скоростью 10 Гбит/с. Я утверждаю, что он ближе к 81,6 наносекундам для 64-байтной полезной нагрузки Ethernet, но они говорят о 46-битной минимальной теоретической форме.

Чтобы сократить это, вы НЕ МОЖЕТЕ СДЕЛАТЬ ИЛИ ИСПОЛЬЗОВАТЬ любое из следующих действий, если вы хотите сбросить пакет 0% на полную ставку, оставаясь под 81,6 нс для каждого пакета:

  • Сделайте вызов SKB для каждого пакета (чтобы свести к минимуму эти накладные расходы, амортизировало это на несколько 100 пакетов)
  • TLB (буфер пересылки перевода, чтобы избежать этого, используйте HUGE-страницы)
  • Короткая латентность (вы сказали "захват", поэтому латентность здесь неактуальна). Это называется Прерывание Coalesce (ethtool -C rx-frames 1024+).
  • Плавающие процессы в многопроцессорных (необходимо заблокировать их, по одному на прерывание сетевого интерфейса)
  • libc malloc() (необходимо заменить его более быстрым, желательно ОГРОМНЫМ)

Итак, Linux имеет преимущество над FreeBSD, чтобы захватить скорость 10 Гбит/с в скорости снижения 0% и запустить несколько виртуальных машин (и другие накладные расходы). Просто для этого требуется новое управление памятью (MM) определенного типа для определенного сетевого устройства и не обязательно всей операционной системы. Большинство новых супер-высокопроизводительных сетевых драйверов теперь используют устройства HUGE памяти, которые были выделены в userland, а затем используют вызовы драйверов для передачи пакета пакетов за раз.

Многие новые сетевые драйверы с перепрограммированными MM выходят (в определенном порядке):

  • NetMap
  • PF-RING
  • ПФ-КОЛЬЦО + NetMap
  • OpenOnload
  • DPDK
  • PacketShader

Уровень зрелости каждого кода сильно зависит от выбранной вами версии Linux (или дистрибутива). Я пробовал несколько из них, и как только я понял базовый дизайн, стало очевидно, что мне нужно. YMMV.

Удачи.

Ответ 3

PF_RING - хорошее решение, альтернативой может быть netsniff-ng (http://netsniff-ng.org/). Для обоих проектов прирост производительности достигается с помощью механизмов нулевой копии. Очевидно, узким местом может быть HD, его скорость передачи данных.

Ответ 4

Если у вас есть время, перейдите в Intel DPDK. Он обеспечивает доступ к нулевому копированию в регистр оборудования сетевого адаптера. Я смог достичь 0% -ного падения при скорости 10 Гбит/с, 1,5 Мпп на одном ядре. Вам будет лучше в долгосрочной перспективе