x86eth中斷
1. 網卡多隊列
CPU在運行的時候遇到的一些事件, 這些事件有可能是線性程序本身出現的,那也有可能是在CPU的外部 甚至是整個系統的外部出現的事件。那麼 這時就要求CPU強行中止現在正在運行的程序。 並且從一個新的存儲器區域啟動相應的程序去處理這些事件。 還有一點也很重要,就是在處理完這些事件之後,CPU需要恢復到原來的程序繼續運行。 那這些事件就被稱為中斷或者異常。
將CPU運行程序所引發的特殊的事件稱為軟體中斷, 而把外部的這些輸入輸出設備產生的事件稱為升殲硬體中斷。
X86系統採用中斷機制協同處理CPU與其他設備工作。長久以來網卡的中斷默認由cpu0處理,態租在大量小包的網路環境下可能出現cpu0負載高,而其他cpu空閑。後來出現網卡多隊列技術解決這個問題。
當網卡收到數據包時會產生中斷,通知內核有新數據包,然後內核調用中斷處理程序進行響應,把數據包從網卡緩存拷貝到內存,因為網卡緩存大小有限,如果不及時拷出數據,後續數據包將會因為緩存溢出被丟棄,因此這一工作需要立即完成。剩下的處理和操作數據包的工作就會交給軟中斷。高負載的網卡是軟中斷產生的大戶,很容易形成瓶頸。
可以通過顯示/proc/interrupts來顯示中斷信息:
從圖可以看到"124"、"125"分別為eth2-TxRx-0和eth2-TxRx-1的中斷號。
如果有24個CPU的話,那麼將會存在24個這樣的中斷號,從eth2-TxRx-0到eth2-TxRx-23。
每一個中斷號表示一個網卡的工作隊列,在有24個CPU的機器里,每個網卡需要存在24個網路隊列。
通過將中斷號綁定到多CPU並沒有真正實現中斷的分配。支持RSS的網卡,通過多隊列技術,每個隊列對應一個中斷號,通過對每個中斷的綁定,可以實現網卡中斷在cpu多核上的分配。
中斷親和力是指將一個或多個中斷源綁定到特定的 CPU 核心上運行。
/proc/irq/[irq_num]/smp_affinity_list :該文件存放的是CPU列表(十進制)。注意,CPU核心個數用表示編號從0開始,如cpu0,cpu1等
根據上圖所示,124號帆笑兆中斷為網卡eth2的第一個網路隊列的中斷號。我們將它綁定到CPU0上。
echo 0 >/proc/irq/124/smp_affinity_list
根據上面信息可以從/proc/interrupts獲取CPU中斷號信息,來寫腳本實現自動綁定。
使用top命令,然後輸入 1 。
其中 0.0%si 表示當前的軟中斷(software interrupt)的使用率。