啟用 NetQ 接收端調整,以便能夠將 vNIC 要求卸載至實體 NIC。這可提高接收端資料的封包效能。

從 NSX 4.1.0 和 ESXi 8.0 開始,NSX 支援 NetQ 接收端調整。當實體 NIC 卡向主機傳送封包時,此主機上因為主機交換器設定在增強型資料路徑模式下而執行的增強型網路堆疊 (ENS),會在 NUMA 節點的不同邏輯核心之間分散資料。有多種方法可以設定 RSS 引擎。

身為網路管理員,您希望提高接收端資料的輸送量封包效能,因此您可能考慮使用下列其中一個方法來設定 RSS 利用其優勢。
這兩種模式是:
  • RSS 引擎專用於單一 vNIC 佇列:專用的 RSS 引擎會將來自 vNIC 的所有要求完全卸載至實體 NIC。在此模式下,單一 RSS 引擎專用於單一 vNIC 佇列。這可提高輸送量效能,因為 pNIC 將管理接收端資料,並在可用的硬體佇列之間共用這些資料來處理該要求。vNIC 佇列與 pNIC 佇列共同位於同一邏輯核心或快速路徑上。
  • RSS 引擎由多個 vNIC 佇列共用:在此模式下,多個硬體佇列可提供給 vNIC 佇列。但是,處理流量的 vNIC 可能與處理資料的實體硬體佇列不一致。這表示,無法保證 vNIC 與實體 NIC 會保持一致。
備註: 如果 NIC 卡上已啟用「預設佇列接收端調整 (DRSS)」,請將其停用。

必要條件

  • 主機必須執行 ESXi 第 8 版或更新版本。
  • 確保 NIC 卡支援 RSS 功能。
  • NSX 4.0 版和 ESXi 8.0 版開始,支援 EDP NETQ RSS。支援的收件匣驅動程式包括 Intel40en (非同步驅動程式) 和 Mellanox nmlx。請參閱驅動程式說明文件,以確認其是否具有與 ENS 相容的 RSS 實作。

程序

  1. 若要啟用 NetQ/RSS,esxcli system module parameters set -m -i40en -p DRSS=0,0 RSS=1,0

    其中,DRSS=0,0 表示兩個 NIC 連接埠上已停用 DRSS。

    RSS=1,0 表示其中一個 NIC 連接埠上已啟用 NetQ RSS。

  2. 若要解除載入驅動程式,請執行 vmkload_mod -u i40en
  3. 若要重新載入驅動程式以使 RSS 設定生效,請執行 vmkload_mod i40en
  4. 停止裝置管理程式以觸發 PCI fastconnect,使它可以掃描裝置,並使該驅動程式與 NIC 相關聯。

    執行 kill -HUP 'ps | grep mgr | awk '{print $1}'

  5. 若要設定多個 RSS 引擎用於處理來自 vNIC 的 RSS 要求,請在虛擬機器的 .vmx 檔案中設定以下參數。

    ethernet.pnicfeatures = '4',表示 vNIC 要求 RSS 功能。

    ethernet.ctxPerDev = '3',表示已啟用多個內容 (多個邏輯核心) 來處理每個 vNIC。已為多個佇列設定了連接到 vSphere 交換器的虛擬機器。這表示,NUMA 節點的多個邏輯核心可以處理來自 vNIC 的 Tx 和 Rx 流量。

    當多個 vNIC 要求 RSS 卸載時,增強型網路堆疊 (ENS) 不會將其 RSS 要求卸載至 pNIC,而是由共用的 RSS 引擎處理其要求。對於共用的 RSS,可以使用多個 RSS 佇列,但不保證 vNIC 佇列或 pNIC 佇列會並列。

  6. 若要設定專用 RSS 引擎處理來自 vNIC 的要求,請在虛擬機器的 .vmx 檔中設定以下參數。

    ethernet.rssoffload=True

    啟用上述組態之後,來自 vNIC 的 RSS 要求將卸載至實體 NIC。只有一個 vNIC 可以將其要求卸載至 RSS 引擎。在此模式下,vNIC 佇列與 pNIC 佇列一致。

  7. 驗證封包流量是否分佈在 RSS 引擎提供的硬體佇列上。

    執行下列命令。

    vsish

    get /net/pNics/vmnicX/stats

    輸出範例:

    rxq0: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq1: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq2: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq3: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq4: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq5: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq6: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    rxq7: pkts=0 bytes=0 toFill=2047 toProc=0 noBuf=0 csumErr=0
    txq0: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq1: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq2: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq3: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq4: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq5: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq6: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0
    txq7: pkts=0 bytes=0 toFill=0 toProc=0 dropped=0