2011-09-19 103 views
7

我們已經寫了使用netfilter鉤子攔截IP數據包的LKM。問題是,在1Gb/s負載下,我們看到掛鉤通過軟irq只加載一個CPU內核。其他15個內核空閒。所以我認爲鉤子不是多線程的。多核系統上的Netfilter鉤子

所以我的問題是:有什麼辦法可以解決鉤在多個核心上處理?

回答

9

該prolem不是來自netfilter,是你的內核管理中斷的方式。

默認情況下,APIC的舊版本會將所有中斷傳遞給CPU0。

您可以檢查,如果這是你的問題有:

cat /proc/interrupts 

你可以看到,如果網卡的中斷(請記住netfilter的鉤子都在RX或TX軟中斷執行)由處理單核。

在較新版本的內核中,有一個編譯選項(CONFIG_HOTPLUG_CPU),它在現有內核之間平衡了IRQ。

或者,如果你不能更新版本或重新編譯內核,您可以更新SMP親和力(與處理更是一個CPUID面具)嘗試不同核心之間的平衡。或者進入ACPI並進行適當的配置(這裏我無法再提供幫助)。

Here你可以找到所有關於這個東西(SMP affininty和適當的IRQ處理)

+0

謝謝。我知道了。 –

6

的問題可能是你的網卡只有一箇中斷。一些較新的NICS有幾個中斷(所謂的多隊列NIC),允許負載分散在多個線程中。

對於單隊列網卡,可以在新內核中使用一些軟件功能,您可以配置該功能來傳播負載。見例如http://www.spinics.net/lists/linux-doc/msg02975.html瞭解可用的概述。