Se eu transferir um arquivo por meio de uma rede 10G, meu cliente (W10) fica lento porque maximiza fortemente um núcleo:
Agora encontrei esta explicação de como usar vários núcleos:
Essa configuração típica envolve um cliente SMB e um servidor SMB configurados com uma única NIC de 10 GbE. Sem SMB multicanal, se houver apenas uma sessão SMB estabelecida, o SMB usa uma única conexão TCP/IP, que naturalmente fica afinada com um único núcleo de CPU.
...
Com o SMB Multichannel, se o NIC for compatível com RSS, o SMB criará várias conexões TCP/IP para essa única sessão, evitando um possível gargalo em um único núcleo de CPU quando muitos pequenos IOs forem necessários.
Eu habilitei o Multichannel no meu servidor unraid através do smb.conf da seguinte forma e reiniciei o serviço smb:
server multi channel support = yes
Depois disso, o comando powershell Get-SmbMultichannelConnection
no cliente retorna um resultado (antes estava vazio):
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
Mas, como você pode ver, o Client RSS Capable é False .
Verifiquei meu adaptador e o Receive Side Scaling (RSS) está ativado:
Get-SmbClientNetworkInterface
confirma:
Interface Index RSS Capable RDMA Capable Speed IpAddresses Friendly Name
--------------- ----------- ------------ ----- ----------- -------------
11 True False 10 Gbps {192.168.178.21} Ethernet 3
Get-NetAdapterRss
retorna "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
retorna "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
Então, qual poderia ser a razão pela qual meu cliente não é capaz de usar RSS?
Atualização1
Para excluir as dependências do servidor, usei esta documentação para verificar se a placa de rede do meu servidor possui capacidade de 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
Finalmente consegui resolver o problema.
Client RSS Capable
foiFalse
porque o servidor não forneceu sua capacidade de RSS. Para habilitar o RSS eu precisava adicionar isso ao meu smb.conf (ouspeed=1000000000
para adaptador de rede 1G):É muito ruim explicado na documentação do SMB e, finalmente, a sintaxe e o exemplo estão errados:
A sintaxe deve conter o endereço IP do adaptador (um nome como "eth0" não funciona!) e as aspas são obrigatórias. Este bug do samba me deu a dica para isso e esta postagem do blog finalmente confirmou:
E este é o resultado (e os lags desapareceram completamente):
Mais resultados e a história completa podem ser encontrados aqui .