如果我通过 10G 网络传输文件,我的客户端 (W10) 会变得迟钝,因为它会严重耗尽一个核心:
现在我找到了如何使用多核的解释:
此典型配置涉及配置有单个 10GbE NIC 的 SMB 客户端和 SMB 服务器。如果没有 SMB 多通道,如果只建立一个 SMB 会话,则 SMB 使用单个 TCP/IP 连接,这自然会与单个 CPU 内核关联。
...
使用 SMB 多通道,如果 NIC 支持 RSS,则 SMB 将为该单个会话创建多个 TCP/IP 连接,从而避免在需要大量小型 IO 时单个 CPU 内核上的潜在瓶颈。
我通过 smb.conf 在我的 unraid 服务器上启用了 Multichannel,如下所示并重新启动了 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
但正如您所见,Client RSS Capable是False。
我检查了我的适配器并启用了接收端缩放 (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
最后我能够解决这个问题。
Client RSS Capable
是False
因为服务器没有提供它的 RSS 功能。要启用 RSS,我需要将其添加到我的 smb.conf(或speed=1000000000
1G 网络适配器):它在 SMB 文档中的解释非常糟糕,最后语法和示例是错误的:
语法必须包含适配器的 IP 地址(“eth0”之类的名称不起作用!)并且引号是必须的。这个 samba 错误给了我提示,这篇博文最终证实了这一点:
这就是结果(并且滞后完全消失了):
更多结果和完整的故事可以在这里找到。