Ipsec

使用 MSI(消息信號中斷)在不同的 NIC 隊列中分發 IP 數據包

  • February 10, 2011

NetXtreme II BCM5709 千兆乙太網 NIC 支持 MSI 功能(消息信號中斷),它有 8 個隊列。每個隊列在 /proc/interrupts 中都有自己的中斷處理程序。我想要完成的是告訴 NIC 哪些數據包應該去哪個隊列。

問題:

  1. 是否可以通過封裝的協議類型手動指定哪些 IP 數據包應該進入哪個隊列(例如,IPsec 數據包進入一個隊列,而 TCP 數據包進入另一個隊列)?
  2. 如果可能的話 - 我怎麼能在 Linux 下做到這一點?
  3. 如果不可能 - 我應該看看支持 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 核心上的不同中斷處理,以實現可擴展性:

  1. RSS(接收端縮放)- 通過源和目標 IP 以及如果適用,通過 TCP/UDP 源和目標埠將數據包分發到不同的隊列。
  2. VMDq(虛擬機設備隊列)- 按 MAC 地址或 VLAN 標籤分配數據包。主要由虛擬機管理程序使用,但我看不出有任何理由不能在非虛擬機設置中使用它。

RSS 的問題在於它總是使用源 IP 來生成雜湊。雜湊用於查找該數據包應該去哪個隊列。這意味著一個人無法控制哪些數據包應該進入哪個隊列,除非他還可以控制源 IP。

VMDq 似乎更適合我的問題,因為它通過目標 MAC 地址分配數據包。它可以像為同一個介面分配兩個不同的 IP 地址一樣簡單。

來源:

引用自:https://serverfault.com/questions/232403