2012-12-05 81 views
2

我在4核intel機器上有一個多隊列NIC卡和 我綁定了一個cpu核心上的NIC卡的每個隊列(set/proc/irq/xxx/smp_affinity) 讓我們例如core0上的queue0,core1上的queue1等等。如何激活linux中的所有ksoftirqds? (關於linux內核的網絡堆棧)

據說softirq會在硬件中斷髮生的同一內核上調用。 爲什麼ksoftirqd無法在我的機器上平行運行? 這只是一個內核線程(如ksoftirqd/2),將使用核心的100%,但其他都是0%

當我使用

cat /proc/interrupts | grep eth1 

我可以看到,所有的包都均勻分佈到所有NIC隊列。

更新:

下面是100%的軟中斷問題的解決方案,如果你能讀中國 http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3(請參閱#7) 如果不是,其博客上說你可以添加另一張卡,這個問題將被解決

回答

0

ksoftirqd是內核中所有輪詢例程的基礎,包括輪詢卡的網絡隊列。

因此,觸發ksoftirqd會影響它的線程。 事實是,它根本沒有線程。這是因爲觸發ksoftirqd的定時器總是被傳送到同一個內核。

但是,您提出這個問題的目標。首先談論這個目標可能是有意義的,而不是實現這個目標的細節。

+0

好的,我的問題是爲什麼它有100%的核心和0%的其他3核心,我希望所有的100%甚至分佈在4核心,每個25%。 – dilfish

2

ksoftirqd不需要平行運行,因爲它通常不運行softirqs。所有softirqs通常在請求它們的中斷之後立即在CPU上運行。

只有在「softirq」氾濫的情況下,softirqs纔會在ksoftirqd上運行 - 在內核執行中斷後,它會檢查是否需要運行anu softirqs。如果是這樣,它會運行它們。在這些運行中斷啓用期間,所以有可能在運行softirq時發生中斷,標記它們再次運行。這就是爲什麼內核在運行後會再次檢查市場softirqs的原因。

很明顯,如果發生大量的中斷,這可能會非常快速地變成活動鎖定 - 我們所做的只是運行softirqs和中斷,而不會執行任何用戶代碼。這就是內核具有「阻尼器」機制的原因 - 如果在運行10次後檢查是否標記了任何softirq,它們仍會被標記,內核將不會在中斷結束時運行softirqs,而是喚醒特殊內核線程ksoftirqd運行它們直到洪水結束。

這是一個處理IRQ洪水的監督機制,大部分時間處於休眠狀態,因此在正常情況下使用多線程ksoftirqd並不能真正幫助您。

+0

感謝您的澄清。是否有針對「洪水」情況的解決方案? – dilfish

+0

@dilfish是,更改內核代碼。這就是爲什麼它是開源的:-) – gby