如果我通过 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 Capable
是False
因为服务器没有提供 RSS 功能。要启用 RSS,我需要将其添加到我的 smb.conf(或speed=1000000000
1G 网络适配器):
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 守护程序无法启动,因为它找不到任何可用的接口。这与文档所述相反。
可以找到更多结果和完整故事这里。