UDP RSS 在配备 Intel NIC X550-T2 的 Windows 10 上不起作用

UDP RSS 在配备 Intel NIC X550-T2 的 Windows 10 上不起作用

我尝试在大部分时间内无损地获取 10GBit/s 的 UDP 流量(测量设备无法在自己的缓存中保存这么多数据,因此 TCP 在这里不是一个解决方案)。

为了测试我是否可以获取 10GBit/s 的 UDP 流量,我购买了 2 个 Intel X550-T2 NIC 并通过 2 米 Cat7 电缆直接连接它们。但我无法让接收端使用多个 CPU 通过 UDP 获取数据。奇怪的是,使用 TCP 会使用所有 8 个配置的 RSS 队列,我也得到了 10 GBit/s 的流量。
使用 Ubuntu Linux 20.04 也很好用(10GBit/s UDP 流量 0% 丢失)。

我现在的问题是,如何在 Windows 10 上将 RSS 用于 UDP?如果它不起作用,为什么?

接收器硬件:
处理器:AMD Ryzen 3900X
主板:X570a-pro
RAM:64 GB

配置:
Windows 10 专业版
超线程/SMT:已禁用(我不知道这是否是必需的,但微软表示,RCC 仅使用非 SMT 处理器)
DMA 合并:关闭
接收缓冲区:4096
流量控制:Rx+Tx
速度和双工:自动
中断减少:已启用
中断减少率:自适应
IPsec 卸载:关闭
IPv4 - 校验和卸载:Rx + Tx
巨型数据包:9014
Large-Send-Offload V2(IPv4+v6):已启用
最大 Rss 队列:8(我也测试了 16,但没有任何变化)
包优先级和 VLAN:均已停用(同时激活两者没有任何变化)
RSS:已启用
TCP - 校验和卸载(IPv4+v6):Rx + Tx
UDP - 校验和卸载(IPv4+v6):Rx + Tx
发送缓冲区:16384
连接事件日志:已启用

测试方法:
由于RSS是基于S/R IP + S/R Port的哈希,我在接收端启动了10个接收iperf3服务器,每个服务器监听不同的端口,并在发送端启动了10个发送客户端。
发送UDP包占用了接收端的整个CPU/核心,而不是其他核心。而且只能获得5GBit/s。发送TCP包占用了所有指定的8个接收队列,可以获得10Gbit。

答案1

我们发现,此特定 NIC 不会发送指定大小为 9014 字节的 UDP 包(接收不是问题)。一旦 UDP 包大小超过 MTU(在本例中为 1500),它会将所有包分割成几个 IPv4 碎片包。由于 RSS 队列通过协议特定的哈希算法分割其有效负载,因此 NIC 将使用 IP 协议的哈希算法,该算法不考虑端口。

相关内容