Netfilter подключается к многоядерной системе - PullRequest
7 голосов
/ 19 сентября 2011

Мы написали LKM, который использует перехватчики сетевых фильтров для перехвата IP-пакетов.Проблема в том, что при полезной нагрузке 1 Гбит / с мы видим, что хуки загружают только одно ядро ​​процессора через soft irq.Остальные 15 ядер простаивают.Итак, я делаю вывод, что хуки не являются многопоточными.

Итак, мой вопрос: есть ли способ распределить обработку хуков на несколько ядер?

Ответы [ 2 ]

9 голосов
/ 19 сентября 2011

Prolem не из netfilter, это то, как ваше ядро ​​управляет прерываниями.

По умолчанию старые версии APIC доставляют все прерывания в CPU0.

Вы можете проверить, является ли этоВаша проблема с:

cat /proc/interrupts

Вы можете видеть, обрабатываются ли прерывания сетевого адаптера (и помните, что перехват сетевого фильтра выполняется через RX или TX SoftIRQ) одним ядром.

В более новых версиях ядра есть опция компиляции (CONFIG_HOTPLUG_CPU), которая балансирует IRQ по существующим ядрам.

Или, если вы не можете обновить версию или перекомпилировать ядро, вы можете обновить привязку SMP(с маской, которая обрабатывает больше, чем CPUid), чтобы попытаться балансировать между разными ядрами.Или перейдите в ACPI и правильную настройку (здесь я не могу помочь больше).

Здесь вы можете найти все об этом материале (сродство SMP и правильная обработка IRQ)

6 голосов
/ 19 сентября 2011

Проблема может заключаться в том, что ваша сетевая карта имеет только одно прерывание. Некоторые более новые NICS имеют несколько прерываний (так называемые много очереди NIC), позволяющие распределить нагрузку между многими потоками.

Для сетевых адаптеров с одной очередью в более новых ядрах доступны некоторые программные функции, которые можно настроить для распределения нагрузки. Смотрите, например http://www.spinics.net/lists/linux-doc/msg02975.html для обзора того, что доступно.

...