启用 NetQ 接收方调整以将 vNIC 请求卸载到物理网卡。这可提高接收方数据的数据包性能。

从 NSX 4.1.0 和 ESXi 8.0 开始,NSX 支持 NetQ 接收方调整。当物理网卡向主机发送数据包时,此主机上的增强型网络堆栈 (ENS) 会在 NUMA 节点上的不同逻辑内核之间分发数据,此 ENS 配置为增强型数据路径模式,作为主机交换机运行。有多种方法可以配置 RSS 引擎。

作为网络管理员,您希望提高接收端数据的吞吐量数据包性能,您可能需要考虑使用以下方法之一来配置 RSS,以利用其优势。
这两种模式是:
  • RSS 引擎专用于单个 vNIC 队列:专用 RSS 引擎会将来自 vNIC 的所有请求完全卸载到物理网卡。在此模式下,单个 RSS 引擎专用于单个 vNIC 队列。这可提高吞吐量性能,因为 pNIC 管理接收端数据,并在可用的硬件队列之间共享这些数据以处理请求。vNIC 队列与 pnic 队列位于同一逻辑内核或快速路径上。
  • RSS 引擎由多个 vNIC 队列共享:在此模式下,多个硬件队列可用于 vNIC 队列。但是,处理流量的 vNIC 可能与处理数据的物理硬件队列不一致。这意味着,无法保证 vNIC 与物理网卡将保持一致。
注: 如果在网卡上启用了默认队列接收方调整 (DRSS),请将其停用。

前提条件

  • 主机必须运行 ESXi 版本 8 或更高版本。
  • 确保网卡支持 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 表示在两个网卡端口上停用了 DRSS。

    RSS=1,0 表示在其中一个网卡端口上启用了 NetQ RSS。

  2. 要卸载驱动程序,请运行 vmkload_mod -u i40en
  3. 要重新加载驱动程序以使 RSS 设置生效,请运行 vmkload_mod i40en
  4. 停止设备管理器以触发 PCI fastconnect,以便它可以扫描设备并将驱动程序与网卡相关联。

    运行 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 请求将卸载到物理网卡。只有一个 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