Fatos (por favor, identifique quaisquer declarações falsas):
Eu tenho uma conexão de 100 Mbps entre dois sites separados por 80 ms
Essa é uma conexão longa e extensa que pode se beneficiar de um grande tamanho de janela TCP, talvez até 100 Mbps * 0,08 s = 1.000.000 bytes
Ambas as máquinas estão executando o Windows Server 2012. "O nível de ajuste automático da janela de recebimento" é normal em ambas. "Heurísticas de dimensionamento de janelas" estão desativadas em ambos.
Corri "iperf -s" de um lado e "iperf -c" do outro. A transferência ocorreu em 5 Mbps. Eu recebo o mesmo resultado indo na outra direção.
Ambos os lados anunciaram o suporte para janelas deslizantes TCP em seus SYNs.
O receptor solicitou um tamanho de janela TCP de 64.512 bytes (0xFC00) durante toda a execução com um valor de escala da janela TCP de "no shift" (0x000).
A rede conseguiu lidar com um tamanho de janela maior (consulte os diagramas de sequência abaixo)
O receptor manteve a janela menor do que a rede suporta
Esta conexão está acontecendo dentro de uma VPN IPSEC. O MTU da interface do túnel é reduzido para 1400 bytes em ambas as direções.
Questão
- Por que o receptor mantém a janela pequena?
Não respostas
A rede está quebrada
Máquinas Linux em execução na mesma rede abrem a janela TCP para 1,5 megabytes e transmitem dados 6 vezes a largura de banda
As heurísticas de dimensionamento da janela estão ativadas
As heurísticas da escala da janela estão desabilitadas (consulte a saída de "netsh interface tcp show heuristics" abaixo)
O nível de ajuste automático da janela de recebimento não é normal
O nível de ajuste automático da janela de recebimento é normal (consulte a saída de "netsh interface tcp show global" abaixo)
Isso simplesmente não funciona bem em uma máquina virtual no ESXi
Eu obtenho um desempenho 6 vezes melhor em uma máquina linux virtual em execução no mesmo host.
Atualização 1 12 de junho de 2015 16:30 PDT
Modifiquei o teste colocando o linux em um lado da conexão. Com certeza, quando o linux envia dados para o Windows Server 2012, o Windows oferece uma janela de recebimento TCP muito pequena (64.512 bytes).
Quando envio dados do Windows para o linux, o linux oferece uma janela de recebimento de TCP suficientemente grande (1.365.120 bytes). No entanto, o Windows restringe os envios para no máximo ~ 60.000 bytes em andamento.
Atualização 2 13 de junho de 2015 15:00 PDT
Um passo mais perto da causa raiz. Na minha configuração, nem SO_SNDBUF nem SO_RCVBUF são definidos (pelo iperf). Esses são os buffers de envio e recebimento que efetivamente vinculam a janela de recebimento. Quando não especifica esses valores, o Windows Server 2012 fornece um valor padrão de 64 kB. Então a questão é agora:
Questão
- Quando um não é especificado, por que o Windows Server 2012 não está aumentando dinamicamente SO_SNDBUF / SO_RCVBUF para acomodar cachimbos longos, conforme descrito no MSDN ?
Não respostas
"netsh winsock show autotuning" está desativado
Está habilitado.
Atualização 3 24 de agosto de 2015 16:00 PDT
O netsh aparentemente foi substituído por Set-NetTCPSetting e family. Get-NetTCPSetting combinado com Get-NetTCPConnection mostra que estou operando no regime 'Internet', que me oferece as seguintes configurações:
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
Configurações TCP do remetente
PS C:\Users\acs> netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : disabled
Direct Cache Access (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : enabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Receive Segment Coalescing State : enabled
PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics : disabled
Qualifying Destination Threshold : 3
Profile type unknown : normal
Profile type public : normal
Profile type private : normal
Profile type domain : normal
PS C:\Users\acs> Get-NetTCPSetting
SettingName : Automatic
MinRto(ms) :
InitialCongestionWindow(MSS) :
CongestionProvider :
CwndRestart :
DelayedAckTimeout(ms) :
MemoryPressureProtection :
AutoTuningLevelLocal :
AutoTuningLevelGroupPolicy :
AutoTuningLevelEffective :
EcnCapability :
Timestamps :
InitialRto(ms) :
ScalingHeuristics :
DynamicPortRangeStartPort :
DynamicPortRangeNumberOfPorts :
SettingName : Custom
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Compat
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 2
CongestionProvider : Default
CwndRestart : False
DelayedAckTimeout(ms) : 200
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Datacenter
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
Remetente SYN
No. Time Source Destination Protocol Length Delta Sequence number Acknowledgment number Bytes in flight Calculated window size Info
814 5.036577000 10.10.0.21 10.11.0.1 TCP 66 0.000000000 0 0 64512 49758→5001 [SYN, ECN, CWR] Seq=0 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1
Frame 814: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface 0
Ethernet II, Src: 00:11:22:33:44:55, Dst: aa:bb:cc:dd:ee:ff
Internet Protocol Version 4, Src: 10.10.0.21 (10.10.0.21), Dst: 10.11.0.1 (10.11.0.1)
Transmission Control Protocol, Src Port: 49758 (49758), Dst Port: 5001 (5001), Seq: 0, Len: 0
Source Port: 49758 (49758)
Destination Port: 5001 (5001)
[Stream index: 73]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number)
Acknowledgment number: 0
Header Length: 32 bytes
.... 0000 1100 0010 = Flags: 0x0c2 (SYN, ECN, CWR)
Window size value: 64512
[Calculated window size: 64512]
Checksum: 0x1451 [validation disabled]
Urgent pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
Maximum segment size: 1460 bytes
No-Operation (NOP)
Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
Length: 3
Shift count: 0
[Multiplier: 1]
No-Operation (NOP)
No-Operation (NOP)
TCP SACK Permitted Option: True
Perspectiva do remetente do gráfico de sequência
Configurações TCP do receptor
PS C:\Users\acs> netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : disabled
Direct Cache Access (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : enabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Receive Segment Coalescing State : enabled
PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics : disabled
Qualifying Destination Threshold : 3
Profile type unknown : normal
Profile type public : normal
Profile type private : normal
Profile type domain : normal
PS C:\Users\acs> Get-NetTCPSetting
SettingName : Automatic
MinRto(ms) :
InitialCongestionWindow(MSS) :
CongestionProvider :
CwndRestart :
DelayedAckTimeout(ms) :
MemoryPressureProtection :
AutoTuningLevelLocal :
AutoTuningLevelGroupPolicy :
AutoTuningLevelEffective :
EcnCapability :
Timestamps :
InitialRto(ms) :
ScalingHeuristics :
DynamicPortRangeStartPort :
DynamicPortRangeNumberOfPorts :
SettingName : Custom
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Compat
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 2
CongestionProvider : Default
CwndRestart : False
DelayedAckTimeout(ms) : 200
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Datacenter
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
Receptor SYN
No. Time Source Destination Protocol Length Delta Sequence number Acknowledgment number Bytes in flight Calculated window size Info
817 5.110501000 10.11.0.1 10.10.0.21 TCP 70 0.073924000 0 1 64512 5001→49758 [SYN, ACK, ECN] Seq=0 Ack=1 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]
Frame 817: 70 bytes on wire (560 bits), 70 bytes captured (560 bits) on interface 0
Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 00:11:22:33:44:55
Internet Protocol Version 4, Src: 10.11.0.1 (10.11.0.1), Dst: 10.10.0.21 (10.10.0.21)
Transmission Control Protocol, Src Port: 5001 (5001), Dst Port: 49758 (49758), Seq: 0, Ack: 1, Len: 0
Source Port: 5001 (5001)
Destination Port: 49758 (49758)
[Stream index: 73]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number)
Acknowledgment number: 1 (relative ack number)
Header Length: 32 bytes
.... 0000 0101 0010 = Flags: 0x052 (SYN, ACK, ECN)
Window size value: 64512
[Calculated window size: 64512]
Checksum: 0xb5bb [validation disabled]
Urgent pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
Maximum segment size: 1460 bytes
No-Operation (NOP)
Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
Length: 3
Shift count: 0
[Multiplier: 1]
No-Operation (NOP)
No-Operation (NOP)
TCP SACK Permitted Option: True
[SEQ/ACK analysis]
Perspectiva do receptor do gráfico de sequência
Janela TCP
fonte
Respostas:
Eu já vi isso como um problema específico do driver; no meu caso, com os controladores de rede QLogic que estavam tentando usar o TCPChimney. Este link descreve a funcionalidade TCPChimney adicionada no Windows 2008 - mas tenho certeza de que ainda se aplica: https://support.microsoft.com/en-us/kb/951037
Eu recomendaria testar o seguinte, em ordem; após cada teste, reinicie e verifique se o receptor começa a aumentar o TCP RWIN conforme o esperado.
1) Carregue as versões mais recentes dos drivers do adaptador de rede no computador receptor. 1) Desative o TCPChimney no computador receptor 2) Desative todos os descarregamentos 'TCP Receive'. Isso pode ser encontrado nas configurações avançadas das propriedades do adaptador de rede (a mesma área em que Speed & Duplex seria definido) 3) Desativar todos os descarregamentos 'TCP Send' (também nas propriedades avançadas do adaptador de rede)
(E ao contrário do comentário "E grandes tamanhos de janelas TCP acima de 65k são ruins para servidores, pois a demanda de memória para conexões aumenta. 65k por si só também pode não te deixar feliz o suficiente. - user303507 6 de agosto de 15 às 11:30", Windows de recebimento TCP grande NÃO é inerentemente ruim para o servidor.No caso de links de alta largura de banda e alta latência (como relés de satélite), são necessários grandes valores RWIN para que tenhamos mais dados TCP "no canal". Conexão de 600 Mbps com latência de 3000 ms; o link de alta largura de banda ficaria limitado a cerca de 20 KBps; pois apenas 65 KB de dados TCP não-acked poderiam estar "no canal" por vez).
fonte
Parece um bug de auto-ajuste do Windows para mim, talvez algo a ver com isso? https://support.microsoft.com/en-us/kb/932170
Você já tentou solicitar um valor SO_RCVBUF maior manualmente usando o WskControlSocket?
fonte
Use um otimizador de rede como Cisco WAAS ou Riverbed. Eles fazem acks locais rapidamente, assim você não precisa se preocupar com as configurações do servidor. Em redes maiores, você não tem nenhuma influência na configuração do servidor, pois são outras equipes ou isso é terceirizado.
fonte
Aqui estão algumas informações que descobri que podem ser a resposta que você está procurando. Observe que a menção do limite de 64 kb no modo desativado pode ser uma pista para limites semelhantes no modo normal que não estão documentados.
Tente ativar o modo "experimental" para níveis de autoajuste astronômico.
fonte