Receiver limita o tamanho da janela TCP para 64.512

34

Fatos (por favor, identifique declarações falsas):

  1. Eu tenho uma conexão de 100 Mbps entre dois sites separados por 80 ms

  2. Esta é uma conexão longa e gorda que pode se beneficiar de um grande tamanho de janela TCP, talvez até 100 Mbps * 0,08 s = 1.000.000 bytes

  3. As duas máquinas estão executando o Windows Server 2012. "O nível de ajuste automático da janela de recepção" é normal em ambos. "Heurística de escalonamento de janelas" estão desativadas em ambos.

  4. Eu corri "iperf -s" de um lado e "iperf -c" do outro. A transferência aconteceu a 5 Mbps. Eu obtenho o mesmo resultado indo na outra direção.

  5. Ambos os lados anunciaram suporte para janelas deslizantes TCP em seus SYNs.

  6. O destinatário solicitou um tamanho de janela TCP de 64.512 bytes (0xFC00) durante toda a execução com um valor de escala de janela TCP "sem deslocamento" (0x000).

  7. A rede conseguiu lidar com um tamanho de janela maior (consulte a sequência diagramas abaixo)

  8. O receptor manteve a janela menor que a rede suporta

  9. 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.

Pergunta

  • 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 a 6 vezes a largura de banda

  • As heurísticas de escalonamento de janelas estão ativadas

    As heurísticas de escalonamento de janelas estão desativadas (veja a saída de "netsh interface tcp show heuristics" abaixo)

  • O nível de auto-ajuste da janela de recepção não é normal

    O nível de auto-ajuste da janela de recepção é normal (veja 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 rodando no mesmo host.

Atualização 1 12 de junho de 2015 16h30 PDT

Eu 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 recepção TCP muito pequena (64,512 bytes).

Quando envio dados do Windows para o linux, o linux oferece uma janela de recepção TCP grande o suficiente (1.365.120 bytes). No entanto, o Windows restringe os envios a um máximo de 60.000 bytes em vôo.

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 configurados (por iperf). Esses são os buffers de envio e recebimento que efetivamente ligam a janela de recebimento. Quando não estiver especificando esses valores, o Windows Server 2012 fornecerá um valor padrão de 64 kB. Então a questão é agora:

Pergunta

  • Quando um não é especificado, por que o Windows Server 2012 não aumenta dinamicamente o SO_SNDBUF / SO_RCVBUF para acomodar cachimbos longos, conforme descrito em MSDN ?

Não respostas

  • "netsh winsock show autotuning" está desativado

    Está ativado.

Atualização 3 24 de agosto de 2015 16:00 PDT

O netsh aparentemente foi substituído pelo Set-NetTCPSetting e pela família. Get-NetTCPSetting combinado com Get-NetTCPConnection mostra que estou operando no regime 'Internet' que me oferece estas 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

    
por Chris Stankevitz 12.06.2015 / 09:18

4 respostas

1

Eu vi isso como um problema específico do driver; no meu caso, com 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: link

Eu recomendaria testar o seguinte, em ordem; após cada teste, reinicialize e veja se o receptor começa a aumentar o TCP RWIN conforme o esperado.

1) Carregue as versões mais recentes dos drivers para o adaptador de rede no computador de destino. 1) Desativar TCPChimney no computador receptor 2) Desabilite todos os descarregamentos de 'Recebimento TCP'. Isso pode ser encontrado em Configurações Avançadas das Propriedades do Adaptador de Rede (a mesma área em que Velocidade & Duplex serão configurados) 3) Desabilitar todo o descarregamento 'TCP Send' (também nas propriedades avançadas do adaptador de rede)

( E ao contrário do comentário "E os grandes tamanhos de janela TCP acima de 65k são ruins para os servidores, já que a demanda de memória por conexões aumenta. 65k sozinho também pode não fazer você feliz o suficiente. - user303507 6 de agosto às 11:30", grande TCP Receive Windows NÃO são inerentemente ruins para o servidor. No caso de links de alta latência e alta largura de banda (como os satélites), são necessários grandes valores RWIN para termos mais dados TCP "no canal". Imagine uma conexão de 600 Mbps com latência de 3000 ms; o link de alta largura de banda seria limitado a cerca de 20 KBps, já que apenas 65 KB de dados TCP não carregados poderiam estar "no canal" por vez. )

    
por 09.06.2016 / 04:52
0

Parece um bug de auto-ajuste do Windows para mim, talvez algo a ver com isso? link

Já tentou solicitar um valor SO_RCVBUF maior manualmente usando o WskControlSocket?

    
por 19.06.2015 / 18:36
0

Use um otimizador de rede como o Cisco WAAS ou o Riverbed. Eles fazem acks locais rapidamente, então você não precisa se preocupar com as configurações do servidor. Na rede maior, você não tem influência na configuração do servidor, já que essas são outras equipes ou isso é terceirizado.

    
por 06.08.2015 / 13:28
0

Aqui está algumas informações que descobri que podem ser a resposta que você está procurando. Observe que a menção do limite de 64kb no modo desativado pode ser uma pista para limites semelhantes no modo normal que não são documentados.

Tente ativar o modo "experimental" para os níveis de autoajuste astronômico.

When setting Windows Auto-Tuning level the possible settings are as follows:

  • normal: default value, allows the receive window to grow to accommodate most conditions
  • disabled: uses a fixed value for the tcp receive window. Limits it to 64KB (limited at 65535).
  • highlyrestricted: allows the receive window to grow beyond its default value, very conservatively
  • restricted: somewhat restricted growth of the tcp receive window beyond its default value
  • experimental: allows the receive window to grow to accommodate extreme scenarios (not recommended, it can degrade performance in common scenarios, only intended for research purposes. It enables RWIN values of over 16 MB)
    
por 02.06.2016 / 17:08