2011-09-19 12 views
7

Hemos escrito LKM que está utilizando ganchos netfilter para interceptar paquetes IP. El problema es que en la carga útil de 1 Gb/s vemos que los enganches cargan solo un núcleo de CPU a través de irq suave. Otros 15 núcleos están inactivos. Entonces, llego a la conclusión de que los enganches no son multihilo.Ganchos Netfilter en sistema multi-core

Así que mi pregunta es: ¿hay alguna forma en que pueda distribuir los anzuelos en varios núcleos?

Respuesta

9

El prolem no es de netfilter, es la forma en que su kernel está manejando las interrupciones.

Por defecto, las versiones antiguas de APIC ofrecen todas las interrupciones a la CPU0.

Puede comprobar si este es su problema:

cat /proc/interrupts 

Puede ver si las interrupciones del NIC (y recuerde que el gancho netfilter se ejecutará en un RX o TX softirq) son manejados por una núcleo simple.

En las versiones más nuevas del kernel, hay una opción de compilación (CONFIG_HOTPLUG_CPU), que equilibra el IRQ sobre los núcleos existentes.

O si no puede actualizar la versión o recompilar el kernel, puede actualizar la afinidad SMP (con una máscara que maneja más que un CPUid) para tratar de equilibrar entre diferentes núcleos. O ingrese a ACPI y a la configuración adecuada (Aquí no puedo ayudar más).

Here se puede encontrar todo acerca de estas cosas (affininty SMP y el manejo adecuado de IRQ)

+0

Gracias. Entiendo. –

6

Un problema podría ser que su tarjeta de red tiene una sola interrupción. Algunos NICS más nuevos tienen varias interrupciones (las denominadas NIC multicheue) que permiten que la carga se distribuya entre muchos hilos.

Para las NIC de una sola cola, hay algunas funciones de software disponibles en núcleos más nuevos que puede configurar para distribuir la carga. Ver p. http://www.spinics.net/lists/linux-doc/msg02975.html para una descripción general de lo que está disponible.