Fakty (proszę podać wszelkie fałszywe oświadczenia):
Mam połączenie 100 Mbps między dwiema stronami, które są w odległości 80 ms
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
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.
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.
Obie strony reklamowały obsługę okien przesuwnych TCP w swoich SYN-ach.
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).
Sieć była w stanie obsłużyć większy rozmiar okna (patrz schematy sekwencji poniżej)
Odbiornik utrzymywał okno mniejsze niż obsługiwane przez sieć
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
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
Okno TCP
źródło
Odpowiedzi:
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.)
źródło
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?
źródło
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.
źródło
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.
źródło