Il ricevitore limita la dimensione della finestra TCP a 64.512


34

Fatti (si prega di identificare eventuali dichiarazioni false):

  1. Ho una connessione a 100 Mbps tra due siti distanti 80 ms

  2. Questa è una connessione long fat che potrebbe beneficiare di una finestra TCP di grandi dimensioni, forse fino a 100 Mbps * 0,08 sec = 1.000.000 di byte

  3. Entrambe le macchine eseguono Windows Server 2012. "Ricevi il livello di ottimizzazione automatica della finestra" è normale su entrambi. La "euristica del ridimensionamento delle finestre" è disabilitata su entrambi.

  4. Ho eseguito "iperf -s" da un lato e "iperf -c" dall'altro. Il trasferimento è avvenuto a 5 Mbps. Ottengo lo stesso risultato andando nella direzione opposta.

  5. Entrambe le parti hanno pubblicizzato il supporto per le finestre scorrevoli TCP nei loro SYN.

  6. Il ricevitore ha richiesto una dimensione della finestra TCP di 64.512 byte (0xFC00) durante l'intera esecuzione con un valore di scala della finestra TCP di "no shift" (0x000).

  7. La rete era in grado di gestire una finestra di dimensioni maggiori (vedere i diagrammi di sequenza di seguito)

  8. Il ricevitore ha mantenuto la finestra più piccola rispetto ai supporti di rete

  9. Questa connessione avviene all'interno di una VPN IPSEC. MTU dell'interfaccia del tunnel è ridotta a 1400 byte in entrambe le direzioni.

Domanda

  • Perché il ricevitore mantiene la finestra piccola?

Non-risposte

  • La rete è interrotta

    Le macchine Linux in esecuzione sulla stessa rete aprono la finestra TCP a 1,5 megabyte e trasmettono i dati a una larghezza di banda 6 volte superiore

  • Le euristiche di ridimensionamento delle finestre sono abilitate

    Le euristiche di ridimensionamento delle finestre sono disabilitate (vedere l'output di "interfaccia netsh tcp mostra euristica" di seguito)

  • Il livello di sintonizzazione automatica della finestra di ricezione non è normale

    Il livello di sintonizzazione automatica della finestra di ricezione è normale (vedere l'output di "interfaccia netsh tcp mostra globale" di seguito)

  • Questo non funziona bene su una macchina virtuale all'interno di ESXi

    Ottengo prestazioni 6 volte migliori su una macchina linux virtuale in esecuzione sullo stesso host.


Aggiornamento 1 giugno 12, 2015 16:30 PDT

Ho modificato il test mettendo Linux su un lato della connessione. Abbastanza sicuro, quando Linux invia i dati a Windows Server 2012, Windows offre una finestra di ricezione TCP troppo piccola (64.512 byte).

Quando invio dati da Windows a Linux, Linux offre una finestra di ricezione TCP abbastanza grande (1.3656520 byte). Tuttavia, Windows limita gli invii a un massimo di ~ 60.000 byte in volo.


Aggiornamento 2 giugno 13, 2015 15:00 PDT

Un passo avanti verso la causa principale. Nella mia configurazione, né SO_SNDBUF né SO_RCVBUF sono impostati (da iperf). Questi sono i buffer di invio e ricezione che vincolano efficacemente la finestra di ricezione. Quando non si specificano questi valori, Windows Server 2012 fornisce un valore predefinito di 64 kB. Quindi la domanda è ora:

Domanda

  • Quando non ne viene specificato uno, perché Windows Server 2012 non aumenta in modo dinamico SO_SNDBUF / SO_RCVBUF per adattarsi alle tubazioni lunghe e grasse come descritto in MSDN ?

Non-risposte

  • "netsh winsock show autotuning" è disabilitato

    È abilitato.


Aggiornamento 3 agosto 24, 2015 16:00 PDT

apparentemente netsh è stato sostituito con Set-NetTCPSetting e famiglia. Get-NetTCPSetting combinato con Get-NetTCPConnection mostra che sto operando nel regime "Internet" che mi offre queste impostazioni:

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

Impostazioni TCP mittente

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

Mittente 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

Prospettiva del mittente del grafico di sequenza inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Impostazioni TCP del ricevitore

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

Ricevitore 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]

Prospettiva del ricevitore del grafico di sequenza inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Finestra TCP inserisci qui la descrizione dell'immagine


1
Potete aggiungere la configurazione esatta - software e hardware rilevanti (scheda di rete) per entrambi i lati?
TomTom,

1
Sembra che la regolazione della finestra sia limitata .
David Schwartz,

@TomTom Entrambe le macchine sono macchine virtuali all'interno di ESXi in esecuzione su HP Proliant DL380 G5. Gli adattatori Ethernet virtuali sono Intel 82574L. Gli adattatori ethernet hardware sono BCM5719.
Chris Stankevitz,

@David Schwartz "riceve il livello di regolazione automatica della finestra" è normale su entrambi e "l'euristica del ridimensionamento della finestra" è disabilitata (vedere la configurazione aggiornata in OP). Credo che ciò indichi che la messa a punto non è limitata .
Chris Stankevitz,

2
Non penso che questa domanda sia basata sull'opinione, penso che il vero problema sia che una buona risposta richiederebbe un debug dei sistemi / reti del PO, che può essere fatto solo da lui, e non da noi .
Peter dice di reintegrare Monica il

Risposte:


1

Ho visto questo come un problema specifico del driver; nel mio caso con i controller di rete QLogic che stavano tentando di usare TCPChimney. Questo link descrive la funzionalità TCPChimney aggiunta in Windows 2008, ma sono abbastanza sicuro che si applichi ancora: https://support.microsoft.com/en-us/kb/951037

Consiglierei di testare quanto segue, in ordine; dopo ogni test, riavviare e vedere se il ricevitore inizia ad aumentare TCP RWIN come previsto.

1) Caricare le ultime versioni dei driver per la scheda di rete sul computer ricevente. 1) Disabilita TCPChimney sul computer ricevente 2) Disabilita tutto l'offloading 'Ricezione TCP'. Questo si trova nelle Impostazioni avanzate delle proprietà della scheda di rete (la stessa area in cui verrebbero impostate la velocità e il duplex) 3) Disabilita tutti gli offload "TCP Send" (anche nelle proprietà avanzate della scheda di rete)

(E contrariamente al commento "E le dimensioni di finestre TCP superiori a 65k sono dannose per i server, poiché aumenta la richiesta di memoria per le connessioni. Anche 65k potrebbe non renderti abbastanza felice. - user303507 6 agosto 15 alle 11:30", le grandi finestre di ricezione TCP NON sono intrinsecamente dannose per il server. In caso di larghezza di banda elevata, collegamenti ad alta latenza (come i relè Satellite), sono necessari valori RWIN di grandi dimensioni in modo da disporre di più dati TCP "nella pipe". Connessione a 600 Mbps con latenza di 3000 ms; il collegamento ad alta larghezza di banda sarebbe limitato a circa 20 KBps; poiché solo 65 KB di dati TCP non acquisiti potrebbero essere "nel tubo" alla volta.)


0

Mi sembra un bug di autotuning di Windows, forse qualcosa a che fare con questo? https://support.microsoft.com/en-us/kb/932170

Hai provato a richiedere manualmente un valore SO_RCVBUF più grande utilizzando WskControlSocket?


Tecnicamente quei buffer non hanno una relazione con la dimensione della finestra TCP: stackoverflow.com/questions/14381303/increasing-tcp-window-size
Mary

Phil: Sto eseguendo Windows Server 2012 su entrambi i lati in modo tale collegamento non si applica, ma sospetto un bug di qualche tipo. Posso richiedere un SO_RCVBUF più grande - e questo aiuta - ma ciò non mi aiuta a capire cosa non funziona (vedi "Aggiornamento 2").
Chris Stankevitz l'

Mary: i buffer sono indirettamente correlati alle dimensioni di Windows. Lo stack di rete riconoscerà i piccoli buffer e di conseguenza non aumenterà le dimensioni della finestra. Lo descrivo usando il handwaving in "Aggiornamento 2".
Chris Stankevitz l'

0

Utilizzare un ottimizzatore di rete come Cisco WAAS o Riverbed. Fanno rapidamente ack locali, quindi non è necessario preoccuparsi delle impostazioni del server. Nelle reti più grandi non hai comunque alcuna influenza sulla configurazione del server in quanto si tratta di altri team o questo è esternalizzato.


E le dimensioni di finestre TCP superiori a 65k sono dannose per i server, poiché aumenta la richiesta di memoria per le connessioni. Anche solo 65k potrebbero non renderti abbastanza felice.
user303507

user303507: Voglio capire cosa sta succedendo con lo stack di rete di Windows Server 2012. Non mi interessa mascherare il problema con un'appliance di rete. Ma sono d'accordo sul fatto che acquistare un apparecchio di rete o avvicinare i miei uffici risolverà questo problema.
Chris Stankevitz, l'

Il commento di user303507 potrebbe essere sulla strada giusta: mi chiedo se il problema di memoria induca Windows a limitare le dimensioni della finestra in base a impostazioni euristiche o del registro invisibili. Non è un comportamento appropriato, supponendo che tu abbia ragione sulla documentazione.
Dan Pritts,

0

Ecco alcune informazioni che ho scoperto che potrebbero essere la risposta che stai cercando. Nota che la menzione del limite di 64kb in modalità disabilitata può essere un indizio di limiti simili in modalità normale che non sono documentati.

Prova ad abilitare la modalità "sperimentale" per i livelli di Auto-Tuning astronomici.

Quando si imposta il livello di sintonizzazione automatica di Windows, le possibili impostazioni sono le seguenti:

  • normale: valore predefinito, consente alla finestra di ricezione di espandersi per soddisfare la maggior parte delle condizioni
  • disabilitato: utilizza un valore fisso per la finestra di ricezione tcp. Limita a 64 KB (limitato a 65535).
  • altamente limitato: consente alla finestra di ricezione di crescere oltre il suo valore predefinito, in modo molto prudente
  • limitato: crescita in qualche modo limitata della finestra di ricezione tcp oltre il suo valore predefinito
  • sperimentale: consente alla finestra di ricezione di espandersi per adattarsi a scenari estremi (sconsigliato, può degradare le prestazioni in scenari comuni, solo a scopo di ricerca. Consente valori RWIN superiori a 16 MB)

Ciò avrebbe senso ma l'OP mostra che è limitato a 64k, nemmeno a 1024.
Jim B
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.