为什么 SMB 客户端虽然已启用 RSS 但无法使用?

为什么 SMB 客户端虽然已启用 RSS 但无法使用?

如果我通过 10G 网络传输文件,我的客户端(W10)会变得滞后,因为它严重占用了一个核心: 在此处输入图片描述

现在我发现这个解释如何使用多个核心:

此典型配置涉及一个 SMB 客户端和一个配置了单个 10GbE NIC 的 SMB 服务器。如果没有 SMB 多通道,如果只建立了一个 SMB 会话,SMB 将使用单个 TCP/IP 连接,该连接自然会与单个 CPU 核心关联。

...

使用 SMB 多通道,如果 NIC 支持 RSS,SMB 将为单个会话创建多个 TCP/IP 连接,从而避免在需要大量小型 IO 时单个 CPU 核心可能出现的瓶颈。 在此处输入图片描述

我通过 smb.conf 在我的 unraid 服务器上启用了多通道,如下所示,并重新启动了 smb 服务:

server multi channel support = yes

之后Get-SmbMultichannelConnection客户端上的powershell命令返回结果(之前是空的):

Server Name Selected Client IP      Server IP     Client Interface Index Server Interface Index Client RSS Capable Client RDMA Capable
----------- -------- ---------      ---------     ---------------------- ---------------------- ------------------ -------------------
THOTH       True     192.168.178.21 192.168.178.9 11                     13                     False              False

但正如你所看到的客户端 RSS 支持错误的

我检查了我的适配器并且接收方缩放(RSS)已启用:

在此处输入图片描述

Get-SmbClientNetworkInterface确认:

Interface Index RSS Capable RDMA Capable Speed   IpAddresses      Friendly Name
--------------- ----------- ------------ -----   -----------      -------------
11              True        False        10 Gbps {192.168.178.21} Ethernet 3

Get-NetAdapterRss返回“MaxProcessors = 4”:

Name                                            : Ethernet 3
InterfaceDescription                            : Aquantia AQtion 10Gbit Network Adapter
Enabled                                         : True
NumberOfReceiveQueues                           : 4
Profile                                         : NUMAStatic
BaseProcessor: [Group:Number]                   : 0:0
MaxProcessor: [Group:Number]                    : 0:3
MaxProcessors                                   : 4
RssProcessorArray: [Group:Number/NUMA Distance] : 0:0/0  0:1/0  0:2/0  0:3/0
IndirectionTable: [Group:Number]                : 0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3
                                                  0:0   0:1     0:2     0:3     0:0     0:1     0:2     0:3

Get-SmbClientConfiguration返回“EnableMultiChannel = True”:

ConnectionCountPerRssNetworkInterface : 4
DirectoryCacheEntriesMax              : 16
DirectoryCacheEntrySizeMax            : 65536
DirectoryCacheLifetime                : 10
DormantFileLimit                      : 1023
EnableBandwidthThrottling             : True
EnableByteRangeLockingOnReadOnlyFiles : True
EnableInsecureGuestLogons             : True
EnableLargeMtu                        : True
EnableLoadBalanceScaleOut             : True
EnableMultiChannel                    : True
EnableSecuritySignature               : True
ExtendedSessionTimeout                : 1000
FileInfoCacheEntriesMax               : 64
FileInfoCacheLifetime                 : 10
FileNotFoundCacheEntriesMax           : 128
FileNotFoundCacheLifetime             : 5
KeepConn                              : 600
MaxCmds                               : 50
MaximumConnectionCountPerServer       : 32
OplocksDisabled                       : False
RequireSecuritySignature              : False
SessionTimeout                        : 60
UseOpportunisticLocking               : True
WindowSizeThreshold                   : 8

那么我的客户端无法使用 RSS 的原因是什么?

更新1

为了排除服务器依赖关系我使用了本文档检查我的服务器网卡是否具有 RSS 功能:

egrep 'CPU|eth0' /proc/interrupts
            CPU0       CPU1       CPU2       CPU3       
 129:   29144060          0          0          0  IR-PCI-MSI 524288-edge      eth0
 131:          0   25511547          0          0  IR-PCI-MSI 524289-edge      eth0
 132:          0          0   40776464          0  IR-PCI-MSI 524290-edge      eth0
 134:          0          0          0   17121614  IR-PCI-MSI 524291-edge      eth0

ethtool -x eth0
RX flow hash indirection table for eth0 with 4 RX ring(s):
    0:      0     1     2     3     0     1     2     3
    8:      0     1     2     3     0     1     2     3
   16:      0     1     2     3     0     1     2     3
   24:      0     1     2     3     0     1     2     3
   32:      0     1     2     3     0     1     2     3
   40:      0     1     2     3     0     1     2     3
   48:      0     1     2     3     0     1     2     3
   56:      0     1     2     3     0     1     2     3
RSS hash key:
1e:ad:71:87:65:fc:26:7d:0d:45:67:74:cd:06:1a:18:b6:c1:f0:c7:bb:18:be:f8:19:13:4b:a9:d0:3e:fe:70:25:03:ab:50:6a:8b:82:0c
RSS hash function:
    toeplitz: on
    xor: off
    crc32: off

答案1

最后我终于解决了这个问题。Client RSS CapableFalse因为服务器没有提供 RSS 功能。要启用 RSS,我需要将其添加到我的 smb.conf(或speed=10000000001G 网络适配器):

server multi channel support = yes
interfaces = "10.10.10.10;capability=RSS,speed=10000000000"

是真的SMB 文档中解释得不好最后语法和示例是错误的:

In order to support SMB3 multi-channel configurations, smbd understands some extra data that can be appended after the actual interface with this extended syntax:

interface[;key1=value1[,key2=value2[...]]]

Known keys are speed, capability, and if_index. Speed is specified in bits per second. Known capabilities are RSS and RDMA.

...

Example: interfaces = eth0 192.168.2.10/24 192.168.3.10/255.255.255.0

语法必须包含适配器的 IP 地址(“eth0”这样的名称不起作用!)并且必须使用引号。这个 Samba 错误给了我提示,这篇博文最终确认:

在我的情况下,接口值必须是 IP 地址。尝试指定接口名称(例如 lagg0 或 vlan101)不起作用,并导致 SMB 守护程序无法启动,因为它找不到任何可用的接口。这与文档所述相反。

这就是结果(并且滞后完全消失了): 在此处输入图片描述

可以找到更多结果和完整故事这里

答案2

除了以上所有有用的信息外,我还要补充一点:

使能够 *巨型数据包在网络适配器高级设置下 - 在我的示例中为“英特尔以太网控制器 X540-AT2”,使用 Windows 10。

以下是屏幕截图:
高级网络适配器设置

相关内容