2011-09-19 11 views
7

Abbiamo scritto LKM che utilizza gli hook netfilter per intercettare i pacchetti IP. Il problema è che sul carico utile di 1 Gb/s vediamo che gli hook caricano solo un core della CPU tramite soft irq. Altri 15 core sono inattivi. Quindi concludo che gli hook non sono il multithreading.Ganci Netfilter su sistema multi-core

Quindi la mia domanda è: c'è un modo in cui posso disapprovare la gestione degli hook su più core?

risposta

9

Il prolem non è da netfilter, è il modo in cui il kernel gestisce gli interrupt.

Per impostazione predefinita, le versioni precedenti di APIC recapitano tutti gli interrupt alla CPU0.

È possibile verificare se questo è il vostro problema con:

cat /proc/interrupts 

Potete vedere se gli interrupt del NIC (e ricordare che il gancio di netfilter vengono eseguiti nel corso di un RX o TX softirq) sono gestite da un single core.

Nelle versioni più recenti del kernel, esiste un'opzione di compilazione (CONFIG_HOTPLUG_CPU), che bilancia gli IRQ sui core esistenti.

Oppure, se non è possibile aggiornare la versione o ricompilare il kernel, è possibile aggiornare l'affinità SMP (con una maschera che gestisce più CPU) per tentare di bilanciare tra diversi core. O andare in ACPI e configurazione corretta (qui non posso aiutare di più).

Here potete trovare tutto su questa roba (SMP affininty e la gestione IRQ corretto)

+0

Grazie. Capito. –

6

Un problema potrebbe essere che il vostro NIC ha un solo interrupt. Alcuni nuovi NICS hanno diversi interrupt (le cosiddette NIC multiqueue) che consentono di distribuire il carico tra più thread.

Per le NIC di coda singola sono disponibili alcune funzionalità software nei kernel più recenti che è possibile configurare per distribuire il carico. Vedi per es. http://www.spinics.net/lists/linux-doc/msg02975.html per una panoramica di ciò che è disponibile.