使用 MSI(消息信號中斷)在不同的 NIC 隊列中分發 IP 數據包
NetXtreme II BCM5709 千兆乙太網 NIC 支持 MSI 功能(消息信號中斷),它有 8 個隊列。每個隊列在 /proc/interrupts 中都有自己的中斷處理程序。我想要完成的是告訴 NIC 哪些數據包應該去哪個隊列。
問題:
- 是否可以通過封裝的協議類型手動指定哪些 IP 數據包應該進入哪個隊列(例如,IPsec 數據包進入一個隊列,而 TCP 數據包進入另一個隊列)?
- 如果可能的話 - 我怎麼能在 Linux 下做到這一點?
- 如果不可能 - 我應該看看支持 MSI-X 的 NIC 卡來解決這個問題嗎?
更多細節:
我們有一個正在終止 IPSec 和轉發/終止 TCP 連接的介面。IPSec 數據包解密是內聯的(這意味著解密是在相同的 ksoftirqd/X 上下文下完成的)。我們正在嘗試找出如果 IPSec 數據包將被安排在另一個 CPU 上而不是 TCP 數據包上,我們是否能夠提高總體性能。另一個限制是 IPSec 程式碼不是 MP 安全的,因此我不能在多個 ksoftirqd/X 下執行它。預設情況下,數據包似乎是由源 IP 在 8 個 NIC 隊列上分發/散列的。瓶頸是 IPSec,它在 ksoftirqd/X 上下文下以 ~100% CPU 解密/加密 IPSec 數據包時阻塞 TCP 流量。
作業系統是 Ubuntu 10.10 (2.6.32-27-server),網卡是 Broadcom BCM5709。
如果其他人試圖找出如何使 Linux 網路 TCP/IP 堆棧在多個 CPU 核心上擴展……
MSI 可以被兩種底層 NIC 技術利用來跨多個隊列分發數據包。每個 NIC 隊列由專用 CPU 核心上的不同中斷處理,以實現可擴展性:
- RSS(接收端縮放)- 通過源和目標 IP 以及如果適用,通過 TCP/UDP 源和目標埠將數據包分發到不同的隊列。
- VMDq(虛擬機設備隊列)- 按 MAC 地址或 VLAN 標籤分配數據包。主要由虛擬機管理程序使用,但我看不出有任何理由不能在非虛擬機設置中使用它。
RSS 的問題在於它總是使用源 IP 來生成雜湊。雜湊用於查找該數據包應該去哪個隊列。這意味著一個人無法控制哪些數據包應該進入哪個隊列,除非他還可以控制源 IP。
VMDq 似乎更適合我的問題,因為它通過目標 MAC 地址分配數據包。它可以像為同一個介面分配兩個不同的 IP 地址一樣簡單。
來源: