Windows Server 2012 R2 manque de ports éphémères, mais il ne devrait pas

13

Nous rencontrons régulièrement d'étranges problèmes de mise en réseau sur notre serveur dédié. Il exécute Windows Server 2012 R2 x64 sur Xeon E5620 avec 16 Go de RAM et une carte réseau Intel 82575EB.

S'il vous plaît noter que nous avons déjà à l' écoute des HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersvaleurs clés TcpTimedWaitDelayet MaxUserPortà 30 et 65530 respectivement.

À un moment aléatoire, nos sites Web cessent de répondre, car ils ne peuvent pas se connecter à une base de données locale. C'est environ 2 semaines de disponibilité lorsque ces problèmes commencent à se produire. Le journal système commence à recevoir les avertissements TCPIP 4227 et 4231. Il indique "Une demande d'allocation d'un numéro de port éphémère à partir de l'espace de port TCP global a échoué en raison de l'utilisation de tous ces ports.".

Si je cours

Get-Counter -Counter \TCPv4\*

ou

Get-Counter -Counter \TCPv6\*

ou

netstat -abn | find /c ":"

J'obtiens toujours une valeur raisonnable de 500 à 1500 connexions, ce qui n'est même pas proche de la limite de 65K.

En outre, «localhost» cesse de résoudre localement à :: 1, revenant à 127.0.0.1
Seul un redémarrage forcé de la machine peut résoudre la situation.

Serait-ce un problème de carte réseau?

MISE À JOUR 1

Cela s'est produit à nouveau et semble avoir été résolu lorsque j'ai redémarré le serveur de messagerie. Bizarre cependant, tous les compteurs ont montré ~ 1000 connexions avec ~ 500 étant actives en ce moment, et toujours l'erreur de socket 10055 lors de la tentative de connexion à la base de données qui n'a rien à voir avec le serveur de messagerie.

MISE À JOUR 2 C'est étrange, mais le redémarrage quotidien des services de messagerie résout complètement le problème.

CamaroSS
la source
2
À propos de la MISE À JOUR 2. Donc, cela indique simplement que les services de messagerie génèrent trop de connexions sans les fermer et que vous n'avez pas résolu le problème, mais cachez-le jusqu'à ce qu'il s'aggrave et 2 redémarrages par jour seront nécessaires un certain temps ... On dirait que cacher plutôt que résoudre problème ...
Mikhail

Réponses:

9

J'ai eu un problème similaire avec un pool épuisé de ports TCP / IP sur WinSvr 2012R2 x64 pendant près d'un mois où le serveur a cessé de recevoir des connexions nouvelles et TCP. J'ai donc joué avec les valeurs de registre et celles-ci sont stables pour moi:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005
  • TcpTimedWaitDelay - 30
  • MaxUserPort - 65534
  • TcpNumConnections - devrait être dans son état par défaut étiré au maximum = 16777214 devrait empêcher le serveur d'épuiser les ports éphémères.
  • TcpMaxDataRetransmissions - Délai d' expiration de la retransmission des segments de données TCP non acquittés sur la connexion réelle = 5.

Résultat identique au vôtre. Je pense que vous devriez envisager de vérifier votre comportement des performances de vos applications / scripts. Si tout va bien et que rien ne vous aide, vous pouvez essayer de mettre le serveur proxy avant votre serveur d'applications Web, créer 2 nœuds avec le serveur Web (IIS, Apache, ...) qui partageront le même contenu statique et accéderont à la même base de données en même temps. temps (si vous avez suffisamment de ressources dans votre entreprise).

Peut-être que cet article vous aiderait d'une manière ou d'une autre: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it- s-important.aspx

MyKE
la source
1
Vous auriez dû lire la question attentivement avant de répondre. Bien sûr, j'ai essayé cette solution avant de demander, c'est très courant. J'ai déjà résolu le problème par un autre moyen.
CamaroSS
1
Je pense que le redémarrage quotidien des services de messagerie n'est pas un problème résolu. Avez-vous trouvé une autre solution?
MyKE
3
@CamaroSS: veuillez partager votre solution (si cela va au-delà du "redémarrage du service de messagerie" - ce n'est pas une solution). De plus, vous devriez peut-être l'apprécier un peu plus si quelqu'un essaie de vous aider.
Sven
@CamaroSS Et si vous lisez attentivement ma réponse, vous verrez "Résultat identique au vôtre", alors j'ai posté une autre information ..
MyKE
1
Le réglage MaxUserPortfonctionne- t-il toujours en 2012? Je pensais qu'en 2012, vous devez le faire via netsh. par exemple:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx
4

Outre les paramètres du pilote Tcpip, la plage de ports TCP éphémère est gérée dans Windows Server à l'aide de la commande netsh ( source ).

Vous pouvez afficher la plage de ports dynamiques avec les commandes suivantes:

  • netsh int ipv4 show dynamicport tcp
  • netsh int ipv4 show dynamicport udp
  • netsh int ipv6 show dynamicport tcp
  • netsh int ipv6 show dynamicport udp

Pour modifier la plage de ports, utilisez cette commande:

  • netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

Par exemple:

netsh int ipv4 set dynamicport tcp start=49152 num=16384

Le paramètre (start = 49152 num = 16384 ) est également la valeur par défaut sur Windows Server 2008.

rustyx
la source
Merci beaucoup pour cela - j'ai déjà passé des heures à essayer de résoudre mon problème. Tous les conseils que j'ai pu trouver concernaient l'ajustement de MaxUserPort dans le registre et personne n'a mentionné netsh.
milosz
3

A eu ce même problème sur Windows Server 2016 en exécutant de grandes quantités de tests Selenium à l'aide de chromewebdriver. Ce script PS configurera automatiquement les paramètres @Myke partagés ci-dessus. La shutdowncommande a été ajoutée car un redémarrage est requis pour les modifications de la pile TCP.

Augmenter la taille du pool pour les ports TCP éphémères

Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name MaxUserPort -Value 65534 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpTimedWaitDelay -Value 30 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpNumConnections -Value 16777214 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpMaxDataRetransmissions -Value 5 -Force | Out-Null

shutdown -r -t 0

C'était le message d'erreur que nous recevions Webdriver.Quit()en nous disant qu'une adresse TCP était en cours d'utilisation.

Erreur : EADDRINUSE connectez EADDRINUSE 127.0.0.1:12843 à ClientRequest. (\ node_modules \ selenium-webdriver \ http \ index.js: 238: 15)
De : Tâche: WebDriver.quit ()

SliverNinja - MSFT
la source
1

Vous êtes-vous assuré de ne pas divulguer d'objets de connexion à la base de données? Vous devez fermer chaque connexion de base de données ouverte, soit explicitement (avec try-finally) soit avec un bloc using {}. Il s'agit d'un problème courant dont ASP ne vous parlera pas directement.

James
la source
C'est un tas de sites PHP, la plupart d'entre eux fonctionnent via FastCGI en utilisant une connexion persistante, donc cela ne devrait pas être le cas. Si c'était le cas, les compteurs du système renverraient des valeurs beaucoup plus élevées. Je ne peux pas non plus expliquer pourquoi localhost s'arrête soudainement pour se résoudre à :: 1 et se résout à 127.0.0.1 à la place.
CamaroSS
2
:: 1 disparition n'est probablement qu'un effet secondaire du débordement des ports autorisés - je soupçonne que Windows essaie un ping IPv6 et quand il ne peut pas obtenir de port pour faire la tentative, il retombe sur IPv4. PHP est en dehors de mes domaines d'expertise. :-(. Bonne chance!
James