Fakten (bitte identifiziere falsche Angaben):
Ich habe eine 100-Mbit / s-Verbindung zwischen zwei Standorten, die 80 ms voneinander entfernt sind
Dies ist eine lange, fette Verbindung, die von einer großen TCP-Fenstergröße von möglicherweise bis zu 100 Mbit / s * 0,08 s = 1.000.000 Byte profitieren kann
Auf beiden Computern wird Windows Server 2012 ausgeführt. "Automatische Optimierung des Empfangsfensters" ist auf beiden Computern normal. "Heuristik der Fensterskalierung" ist in beiden Fällen deaktiviert.
Ich habe "iperf -s" auf der einen Seite und "iperf -c" auf der anderen Seite ausgeführt. Die Übertragung erfolgte mit 5 Mbit / s. Ich bekomme das gleiche Ergebnis in die andere Richtung.
Beide Seiten kündigten Unterstützung für TCP-Schiebefenster in ihren SYNs an.
Der Empfänger forderte während des gesamten Laufs eine TCP-Fenstergröße von 64.512 Byte (0xFC00) mit einem TCP-Fensterskalierungswert von "no shift" (0x000) an.
Das Netzwerk war in der Lage, ein größeres Fenster zu handhaben (siehe Sequenzdiagramme unten)
Der Empfänger hielt das Fenster kleiner als das Netzwerk unterstützt
Diese Verbindung wird in einem IPSEC-VPN hergestellt. Die MTU der Tunnelschnittstelle wird in beide Richtungen auf 1400 Byte reduziert.
Frage
- Warum hält der Empfänger das Fenster klein?
Nicht-Antworten
Das Netzwerk ist kaputt
Linux-Computer, die im selben Netzwerk ausgeführt werden, öffnen das TCP-Fenster auf 1,5 Megabyte und übertragen Daten mit der 6-fachen Bandbreite
Heuristiken zur Fensterskalierung sind aktiviert
Heuristiken der Fensterskalierung sind deaktiviert (siehe Ausgabe von "netsh interface tcp show heuristics" unten)
Der Auto-Tuning-Pegel im Empfangsfenster ist nicht normal
Der Auto-Tuning-Pegel im Empfangsfenster ist normal (siehe Ausgabe von "netsh interface tcp show global" unten).
Dies funktioniert auf einer virtuellen Maschine in ESXi einfach nicht gut
Auf einem virtuellen Linux-Computer, der auf demselben Host ausgeführt wird, ist die Leistung 6-mal höher.
Update 1. Juni 12, 2015, 16:30 Uhr PDT
Ich habe den Test geändert, indem ich Linux auf eine Seite der Verbindung gesetzt habe. Wenn Linux Daten an Windows Server 2012 sendet, bietet Windows ein zu kleines TCP-Empfangsfenster (64.512 Byte).
Wenn ich Daten von Windows an Linux sende, bietet Linux ein ausreichend großes TCP-Empfangsfenster (1.365.120 Byte). Windows beschränkt das Senden jedoch auf maximal ~ 60.000 Byte im Flug.
Update 2. Juni 13, 2015, 15:00 Uhr PDT
Der eigentlichen Ursache einen Schritt näher. In meinem Setup sind weder SO_SNDBUF noch SO_RCVBUF gesetzt (von iperf). Dies sind die Sende- und Empfangspuffer, die das Empfangsfenster effektiv begrenzen. Wenn Sie diese Werte nicht angeben, gibt Windows Server 2012 einen Standardwert von 64 kB an. Die Frage ist also jetzt:
Frage
- Wenn keiner angegeben ist, warum erhöht Windows Server 2012 SO_SNDBUF / SO_RCVBUF nicht dynamisch, um lange Fatpipes aufzunehmen, wie unter MSDN beschrieben ?
Nicht-Antworten
"netsh winsock show autotuning" ist deaktiviert
Es ist aktiviert.
Update 3. August 24, 2015, 16:00 Uhr PDT
netsh wurde anscheinend durch Set-NetTCPSetting und die Familie ersetzt. Get-NetTCPSetting in Kombination mit Get-NetTCPConnection zeigt, dass ich im "Internet" -Regime arbeite, das mir folgende Einstellungen bietet:
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
Absender-TCP-Einstellungen
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
Absender 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
Absenderperspektive des Sequenzdiagramms
TCP-Einstellungen des Empfängers
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
Empfänger 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]
Empfängerperspektive des Sequenzdiagramms
TCP-Fenster
quelle
Antworten:
Ich habe dies als ein fahrerspezifisches Problem gesehen. In meinem Fall mit QLogic-Netzwerkcontrollern, die versucht haben, TCPChimney zu verwenden. Dieser Link beschreibt die TCPChimney-Funktionalität, die in Windows 2008 hinzugefügt wurde - aber ich bin mir ziemlich sicher, dass sie weiterhin gilt: https://support.microsoft.com/en-us/kb/951037
Ich würde empfehlen, Folgendes zu testen, um; Starten Sie nach jedem Test neu und prüfen Sie, ob der Empfänger die TCP-RWIN erwartungsgemäß erhöht.
1) Laden Sie die neuesten Versionen der Treiber für den Netzwerkadapter auf den empfangenden Computer. 1) Deaktivieren Sie TCPChimney auf dem empfangenden Computer. 2) Deaktivieren Sie alle 'TCP Receive'-Offloads. Dies finden Sie in den erweiterten Einstellungen der Eigenschaften des Netzwerkadapters (derselbe Bereich, in dem Geschwindigkeit und Duplex eingestellt werden).
(Und entgegen dem Kommentar "Und große TCP-Fenstergrößen über 65k sind schlecht für Server, da dann der Speicherbedarf für Verbindungen steigt. 65k allein könnten Sie auch nicht glücklich genug machen. - user303507 06.08.15 um 11:30", Große TCP-Empfangsfenster sind von Natur aus NICHT schlecht für den Server. Bei Verbindungen mit hoher Bandbreite und hoher Latenz (wie Satellitenrelais) sind große RWIN-Werte erforderlich, damit mehr TCP-Daten "in der Pipe" sind 600-Mbit / s-Verbindung mit 3000-ms-Latenz; die Verbindung mit hoher Bandbreite wäre auf etwa 20 KBit / s begrenzt, da sich jeweils nur 65 KB nicht bestätigter TCP-Daten "in der Pipe" befinden könnten.)
quelle
Sieht für mich nach einem Windows-Autotuning-Fehler aus, vielleicht hat das etwas damit zu tun? https://support.microsoft.com/en-us/kb/932170
Haben Sie versucht, einen größeren SO_RCVBUF-Wert manuell mit WskControlSocket anzufordern?
quelle
Verwenden Sie einen Netzwerkoptimierer wie Cisco WAAS oder Riverbed. Sie erledigen lokale Aufgaben schnell, sodass Sie sich nicht um die Servereinstellungen kümmern müssen. In einem größeren Netzwerk haben Sie sowieso keinen Einfluss auf die Serverkonfiguration, da es sich um andere Teams handelt oder diese ausgelagert sind.
quelle
Hier sind einige Informationen, die ich entdeckt habe und die möglicherweise die Antwort sind, nach der Sie suchen. Beachten Sie, dass die Erwähnung des 64-KB-Grenzwerts im deaktivierten Modus möglicherweise ein Hinweis auf ähnliche Grenzwerte im normalen Modus ist, die nicht dokumentiert sind.
Versuchen Sie, den "experimentellen" Modus für astronomische Auto-Tuning-Stufen zu aktivieren.
quelle