web-dev-qa-db-fra.com

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

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 RAM et carte réseau Intel 82575EB.

Veuillez noter que nous avons déjà réglé HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters valeurs de clé TcpTimedWaitDelay et 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 global TCP port 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" arrête de résoudre localement en :: 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.

PDATE 2 This IS étrange, mais le redémarrage quotidien des services de messagerie résout complètement le problème.

13
CamaroSS

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 stable 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 TCP retransmission des segments de données 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).

Cet article pourrait peut-être vous aider 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- quand-il-est-important.aspx

9
MyKE

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

Vous pouvez afficher la plage de ports dynamique 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 le par défaut sur Windows Server 2008 et ultérieur.

4
rustyx

Eu ce même problème sur Windows Server 2016 exécutant de grandes quantités de tests Selenium en utilisant chromewebdriver. Ce script PS configurera automatiquement les paramètres @Myke partagés ci-dessus. La commande shutdown 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 éphémères TCP Ports

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 sur Webdriver.Quit() 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 ()

3
SliverNinja - MSFT

Vous êtes-vous assuré de ne pas divulguer d'objets de connexion à la base de données? Vous devez fermer chaque connexion à la 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 expliquera pas directement.

1
James