Odbiornik ogranicza rozmiar okna TCP do 64 512

34

Fakty (proszę podać wszelkie fałszywe oświadczenia):

  1. Mam połączenie 100 Mbps między dwiema stronami, które są w odległości 80 ms

  2. Jest to długie połączenie, które może skorzystać z dużego rozmiaru okna TCP, być może do 100 Mb / s * 0,08 s = 1 000 000 bajtów

  3. Na obu komputerach działa system Windows Server 2012. „Poziom automatycznego dostrajania okna” jest normalny na obu. W obu przypadkach „heurystyka skalowania okien” jest wyłączona.

  4. Z jednej strony uruchomiłem „iperf -s”, az drugiej „iperf -c”. Transfer odbywał się z prędkością 5 Mb / s. Otrzymuję ten sam wynik idąc w innym kierunku.

  5. Obie strony reklamowały obsługę okien przesuwnych TCP w swoich SYN-ach.

  6. Odbiornik zażądał rozmiaru okna TCP 64 512 bajtów (0xFC00) podczas całego przebiegu z wartością skali okna TCP „bez przesunięcia” (0x000).

  7. Sieć była w stanie obsłużyć większy rozmiar okna (patrz schematy sekwencji poniżej)

  8. Odbiornik utrzymywał okno mniejsze niż obsługiwane przez sieć

  9. To połączenie odbywa się w ramach IPSEC VPN. MTU interfejsu tunelu jest zmniejszona do 1400 bajtów w obu kierunkach.

Pytanie

  • Dlaczego odbiornik utrzymuje okno małe?

Brak odpowiedzi

  • Sieć jest zepsuta

    Maszyny z systemem Linux działające w tej samej sieci otwierają okno TCP na 1,5 megabajta i przesyłają dane z 6-krotną przepustowością

  • Heurystyka skalowania okien jest włączona

    Heurystyka skalowania okna jest wyłączona (patrz wyjście „netsh interface tcp show heuristics” poniżej)

  • Poziom automatycznego dostrajania okna odbierania nie jest normalny

    Poziom automatycznego dostrajania okna odbierania jest normalny (patrz wyjście „netsh interface tcp show global” poniżej)

  • To po prostu nie działa dobrze na maszynie wirtualnej w ESXi

    Mam 6-krotnie lepszą wydajność na wirtualnej maszynie linuxowej działającej na tym samym hoście.


Aktualizacja 1 czerwca 12, 16:30 PDT

Zmodyfikowałem test, umieszczając linux po jednej stronie połączenia. Rzeczywiście, gdy Linux wysyła dane do systemu Windows Server 2012, Windows oferuje zbyt małe okno odbioru TCP (64 512 bajtów).

Kiedy wysyłam dane z systemu Windows do systemu Linux, linux oferuje wystarczająco duże okno odbioru TCP (1365120 bajtów). Jednak system Windows ogranicza wysyłanie do maksymalnie ~ 60 000 bajtów w locie.


Aktualizacja 2 13 czerwca 2015 15:00 PDT

Krok bliżej przyczyny źródłowej. W moim ustawieniu ani SO_SNDBUF, ani SO_RCVBUF nie są ustawione (przez iperf). Są to bufory wysyłania i odbierania, które skutecznie ograniczają okno odbioru. Jeśli nie określono tych wartości, system Windows Server 2012 podaje wartość domyślną 64 kB. Pytanie brzmi teraz:

Pytanie

  • Jeśli nie określono, dlaczego Windows Server 2012 nie dynamicznie zwiększa SO_SNDBUF / SO_RCVBUF, aby pomieścić rury o dużej zawartości tłuszczu, jak opisano w MSDN ?

Brak odpowiedzi

  • Opcja „autotuning programu netsh winsock show” jest wyłączona

    To jest włączone.


Aktualizacja 3 24 sierpnia 2015 16:00 PDT

netsh najwyraźniej został zastąpiony przez Set-NetTCPSetting i rodzinę. Get-NetTCPSetting w połączeniu z Get-NetTCPConnection pokazuje, że działam w systemie „Internet”, który oferuje mi następujące ustawienia:

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

Ustawienia TCP nadawcy

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

Nadawca 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

Perspektywa wysyłania wykresu sekwencji wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Ustawienia TCP odbiornika

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

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

Perspektywa odbiornika wykresu sekwencji wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Okno TCP wprowadź opis zdjęcia tutaj

Chris Stankevitz
źródło
1
Czy możesz dodać dokładną konfigurację - miękką ORAZ odpowiednią dla sprzętu (karta sieciowa) dla obu stron?
TomTom
1
Wygląda na to, że strojenie okien jest ograniczone .
David Schwartz,
@TomTom Oba komputery to maszyny wirtualne wewnątrz ESXi działające na HP Proliant DL380 G5. Wirtualne karty Ethernet to Intel 82574L. Sprzętowe adaptery Ethernet to BCM5719.
Chris Stankevitz,
@David Schwartz „poziom automatycznego dostrajania okna” jest normalny zarówno, a „heurystyka skalowania okna” jest wyłączona (patrz zaktualizowana konfiguracja w OP). Uważam, że oznacza to, że strojenie nie jest ograniczone .
Chris Stankevitz,
2
Nie sądzę, aby to pytanie opierało się na opiniach, myślę, że prawdziwy problem z tym, że udzielenie dobrej odpowiedzi wymagałoby debugowania systemów / sieci OP, co może zrobić tylko on, a nie my. .
peterh mówi o przywróceniu Moniki

Odpowiedzi:

1

Widziałem to jako problem specyficzny dla sterownika; w moim przypadku z kontrolerami sieci QLogic, które próbowały używać TCPChimney. Ten link opisuje funkcjonalność TCPChimney dodaną w Windows 2008 - ale jestem pewien, że nadal obowiązuje: https://support.microsoft.com/en-us/kb/951037

Poleciłbym przetestować następujące elementy w celu; po każdym teście uruchom ponownie i sprawdź, czy odbiornik zacznie zwiększać RWIN TCP zgodnie z oczekiwaniami.

1) Załaduj najnowsze wersje sterowników karty sieciowej na komputer odbierający. 1) Wyłącz TCPChimney na komputerze odbierającym 2) Wyłącz wszystkie odciążanie „TCP Receive”. Można to znaleźć w Ustawieniach zaawansowanych we właściwościach karty sieciowej (w tym samym obszarze, w którym ustawiono szybkość i dupleks) 3) Wyłącz wszystkie odciążanie „wysyłania TCP” (także we właściwościach zaawansowanych karty sieciowej)

(I w przeciwieństwie do komentarza „Duże rozmiary okien TCP powyżej 65 tys. Są niekorzystne dla serwerów, ponieważ wtedy zapotrzebowanie na pamięć wzrasta dla połączeń. Sam 65 tys. Może również nie być wystarczająco szczęśliwy. - user303507 6 sierpnia 2015 o 11:30”, duże odbieranie TCP Windows nie jest z natury szkodliwy dla serwera. W przypadku łączy o dużej przepustowości i dużych opóźnieniach (takich jak przekaźniki satelitarne) konieczne są duże wartości RWIN, abyśmy mieli więcej danych TCP „w potoku”. Połączenie 600 Mb / s z opóźnieniem 3000 ms; łącze o dużej przepustowości byłoby ograniczone do około 20 KB / s; ponieważ tylko 65 KB nie potwierdzonych danych TCP może znajdować się jednocześnie w potoku.)

Jason Walker
źródło
0

Wygląda mi na błąd autotuningu Windows, może coś z tym zrobić? https://support.microsoft.com/en-us/kb/932170

Czy próbowałeś ręcznie zażądać większej wartości SO_RCVBUF przy użyciu WskControlSocket?

Phil McKerracher
źródło
Technicznie te bufory nie mają związku z rozmiarem okna TCP: stackoverflow.com/questions/14381303/increase-tcp-window-size
Mary
Phil: Korzystam z systemu Windows Server 2012 po obu stronach, aby link nie miał zastosowania, ale podejrzewam jakiś błąd. Mogę poprosić o większy SO_RCVBUF - i to pomaga - ale to nie pomaga mi zrozumieć, co jest zepsute (patrz „Aktualizacja 2”).
Chris Stankevitz,
Mary: bufory są pośrednio związane z rozmiarem okien. Stos sieciowy rozpozna małe bufory i w konsekwencji nie zwiększy rozmiaru okna. Opisuję to za pomocą falowania ręcznego w „Aktualizacji 2”.
Chris Stankevitz,
0

Użyj optymalizatora sieci, takiego jak Cisco WAAS lub Riverbed. Szybko robią lokalne pakiety, więc nie musisz przejmować się ustawieniami serwera. W większej sieci i tak nie masz wpływu na konfigurację serwera, ponieważ są to inne zespoły lub jest to zlecone na zewnątrz.

użytkownik303507
źródło
Duże rozmiary okien TCP powyżej 65 KB są szkodliwe dla serwerów, ponieważ wtedy zapotrzebowanie na pamięć dla połączeń wzrasta. Sam 65k może również nie być wystarczająco szczęśliwy.
user303507,
user303507: Chcę zrozumieć, co dzieje się ze stosem sieciowym systemu Windows Server 2012. Nie jestem zainteresowany maskowaniem problemu z urządzeniem sieciowym. Zgadzam się jednak, że zakup urządzenia sieciowego lub zbliżenie moich biur do obejścia tego problemu.
Chris Stankevitz,
komentarz użytkownika303507 może być na dobrej drodze - zastanawiam się, czy problem z pamięcią powoduje, że okna ograniczają rozmiar okna w oparciu o jakieś niewidoczne ustawienia heurystyczne lub rejestru. Nie jest to właściwe zachowanie, zakładając, że masz rację co do dokumentacji.
Dan Pritts,
0

Oto kilka odkrytych przeze mnie informacji , które mogą być odpowiedzią, której szukasz. Uwaga: wzmianka o limicie 64 kb w trybie wyłączonym może być wskazówką do podobnych limitów w trybie normalnym, które nie zostały udokumentowane.

Spróbuj włączyć tryb „eksperymentalny” dla astronomicznych poziomów autotuningu.

Podczas ustawiania poziomu autotuningu systemu Windows możliwe ustawienia są następujące:

  • normal: wartość domyślna, pozwala na powiększenie okna odbioru w celu dostosowania do większości warunków
  • wyłączone: używa stałej wartości dla okna odbioru tcp. Ogranicza to do 64 KB (limit 65535).
  • wysoce ograniczony: pozwala, aby okno odbioru przekroczyło wartość domyślną, bardzo zachowawczo
  • ograniczony: nieco ograniczony wzrost okna odbioru tcp poza jego wartość domyślną
  • eksperymentalna: pozwala na powiększenie okna odbioru w celu dostosowania do ekstremalnych scenariuszy (niezalecane, może obniżyć wydajność w typowych scenariuszach, przeznaczonych wyłącznie do celów badawczych. Umożliwia wartości RWIN powyżej 16 MB)
Ziemia
źródło
To miałoby sens, ale OP pokazuje, że jest ograniczony do 64 tys., Nawet do 1024.
Jim B