Faits (veuillez identifier toute fausse déclaration):
J'ai une connexion à 100 Mbps entre deux sites distants de 80 ms
Il s'agit d'une longue connexion longue qui pourrait bénéficier d'une grande taille de fenêtre TCP peut-être jusqu'à 100 Mbps * 0,08 s = 1 000 000 octets)
Les deux machines exécutent Windows Server 2012. "Le niveau de réglage automatique de la fenêtre de réception" est normal sur les deux. Les "heuristiques de mise à l'échelle des fenêtres" sont désactivées sur les deux.
J'ai couru "iperf -s" d'un côté et "iperf -c" de l'autre. Le transfert s'est produit à 5 Mbps. J'obtiens le même résultat dans l'autre sens.
Les deux parties ont annoncé la prise en charge de TCP fenêtres coulissantes dans leurs SYN.
Le récepteur a demandé une taille de fenêtre TCP de 64 512 octets (0xFC00) pendant toute la durée de l'exécution avec une valeur d'échelle de fenêtre TCP fenêtre "sans décalage" (0x000)).
Le réseau a pu gérer une plus grande taille de fenêtre (voir les diagrammes de séquence ci-dessous)
Le récepteur a gardé la fenêtre plus petite que celle prise en charge par le réseau
Cette connexion se produit dans un VPN IPSEC. La MTU de l'interface du tunnel est réduite à 1400 octets dans les deux sens.
Question
Non-réponses
Le réseau est cassé
Les machines Linux fonctionnant sur le même réseau ouvrent la fenêtre TCP à 1,5 mégaoctets et transmettent des données à 6 fois la bande passante
Les heuristiques de mise à l'échelle des fenêtres sont activées
Les heuristiques de mise à l'échelle des fenêtres sont désactivées (voir la sortie de "netsh interface tcp show heuristics" ci-dessous)
Le niveau de réglage automatique de la fenêtre de réception n'est pas normal
Le niveau de réglage automatique de la fenêtre de réception est normal (voir la sortie de "netsh interface tcp show global" ci-dessous)
Cela ne fonctionne tout simplement pas bien sur une machine virtuelle dans ESXi
J'obtiens des performances 6 fois meilleures sur une machine Linux virtuelle fonctionnant sur le même hôte.
Mise à jour 1 12 juin 2015 16h30 PDT
J'ai modifié le test en mettant linux d'un côté de la connexion. Effectivement, lorsque Linux envoie des données à Windows Server 2012, Windows offre une fenêtre de réception TCP TCP $ === trop petite) (64 512 octets).
Lorsque j'envoie des données de Windows vers linux, linux offre une fenêtre de réception suffisamment large TCP (1 365 120 octets). Cependant, Windows limite les envois à ~ 60 000 octets maximum en vol.
Mise à jour 2 13 juin 2015 15h00 PDT
Un pas de plus vers la cause profonde. Dans ma configuration, ni SO_SNDBUF ni SO_RCVBUF ne sont définis (par iperf). Ce sont les tampons d'envoi et de réception qui ont effectivement lié la fenêtre de réception. Lorsqu'il ne spécifie pas ces valeurs, Windows Server 2012 fournit une valeur par défaut de 64 Ko. La question est donc maintenant:
Question
Non-réponses
"netsh winsock show autotuning" est désactivé
Il est activé.
Mise à jour 3 24 août 2015 16h00 PDT
netsh a apparemment été remplacé par Set-NetTCPSetting et sa famille. Get-NetTCPSetting combiné avec Get-NetTCPConnection montre que j'opère dans le régime "Internet" qui me propose ces paramètres:
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
Expéditeur TCP
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
Expéditeur 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
Perspective de l'expéditeur du graphe de séquence
Récepteur TCP Paramètres
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
Récepteur 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]
Perspective du récepteur du graphe de séquence
Fenêtre TCP
J'ai vu cela comme un problème spécifique au pilote; dans mon cas avec les contrôleurs de réseau QLogic qui tentaient d'utiliser TCPChimney. Ce lien décrit la fonctionnalité TCPChimney ajoutée dans Windows 2008 - mais je suis sûr qu'elle s'applique toujours: https://support.Microsoft.com/en-us/kb/951037
Je recommanderais de tester les éléments suivants, dans l'ordre; après chaque test, redémarrez et voyez si le récepteur commence à augmenter le TCP RWIN comme prévu.
1) Chargez les dernières versions des pilotes de la carte réseau sur l'ordinateur récepteur. 1) Désactivez TCPChimney sur l'ordinateur récepteur 2) Désactivez tout déchargement de "réception TCP". Cela se trouverait dans les paramètres avancés des propriétés de la carte réseau (la même zone où la vitesse et le duplex seraient définis) 3) Désactivez tout le déchargement "Envoi TCP" (également dans les propriétés avancées de la carte réseau)
(Et contrairement au commentaire "Et les grandes tailles de fenêtres TCP supérieures à 65k sont mauvaises pour les serveurs, car alors la demande de mémoire pour les connexions augmente. 65k à lui seul pourrait également ne pas vous rendre assez heureux. - user303507 Aug 6 '15 à 11:30 ", grand TCP Les fenêtres de réception ne sont PAS intrinsèquement mauvaises pour le serveur. Dans le cas d'une bande passante élevée, les liaisons à latence élevée (comme les relais satellite), les grandes RWIN des valeurs sont nécessaires pour que nous ayons plus de données TCP "dans le canal". Imaginez une connexion de 600 Mbps avec une latence de 3000 ms; la liaison à large bande passante serait limitée à environ 20 KBps; comme seulement 65 Ko de données non acquittées TCP peuvent être "dans le canal" à la fois.)
Voici quelques informations J'ai découvert que c'était peut-être la réponse que vous cherchiez. Notez que la mention de la limite de 64 Ko en mode désactivé peut être un indice de limites similaires en mode normal qui ne sont pas documentées.
Essayez d'activer le mode "expérimental" pour les niveaux de réglage automatique astronomiques.
Lors de la définition du niveau de réglage automatique de Windows, les paramètres possibles sont les suivants:
- normal: valeur par défaut, permet à la fenêtre de réception de s'agrandir pour s'adapter à la plupart des conditions
- désactivé: utilise une valeur fixe pour la fenêtre de réception TCP. Le limite à 64 Ko (limité à 65 535).
- très restreint: permet à la fenêtre de réception de se développer au-delà de sa valeur par défaut, de façon très conservatrice
- restreint: croissance quelque peu restreinte de la fenêtre de réception TCP au-delà de sa valeur par défaut
- expérimental: permet à la fenêtre de réception de s'agrandir pour s'adapter à des scénarios extrêmes (non recommandé, il peut dégrader les performances dans des scénarios courants, uniquement à des fins de recherche. Il permet des valeurs RWIN de plus de 16 Mo)
Utilisez un optimiseur de réseau comme Cisco WAAS ou Riverbed. Ils effectuent des acks locaux rapidement, vous n'avez donc pas besoin de vous soucier des paramètres du serveur. Dans un réseau plus grand, vous n'avez de toute façon aucune influence sur la configuration du serveur car ce sont d'autres équipes ou cela est externalisé.
Cela ressemble à un bogue de réglage automatique de Windows pour moi, peut-être quelque chose à voir avec cela? https://support.Microsoft.com/en-us/kb/93217
Avez-vous essayé de demander manuellement une valeur SO_RCVBUF supérieure à l'aide de WskControlSocket?