Windows Server 2012 R2 se queda sin puertos efímeros, aunque no debería

13

Regularmente experimentamos problemas extraños con las redes en nuestro servidor dedicado. Ejecuta Windows Server 2012 R2 x64 en Xeon E5620 con 16 GB de RAM e adaptador de red Intel 82575EB.

Tenga en cuenta que ya hemos ajustado HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameterslos valores clave TcpTimedWaitDelayy MaxUserPort30 y 65530 respectivamente.

En un momento aleatorio, nuestros sitios web dejan de responder, ya que no pueden conectarse a una base de datos local. Es aproximadamente 2 semanas de tiempo de actividad cuando estos problemas comienzan a tener lugar. El registro del sistema comienza a recibir advertencias TCPIP 4227 y 4231. Indica "Una solicitud para asignar un número de puerto efímero desde el espacio de puerto TCP global ha fallado debido a que todos estos puertos están en uso".

Si corro

Get-Counter -Counter \TCPv4\*

o

Get-Counter -Counter \TCPv6\*

o

netstat -abn | find /c ":"

Siempre obtengo un valor razonable de 500-1500 conexiones, que ni siquiera está cerca del límite de 65K.

Además, "localhost" deja de resolverse en :: 1 localmente, volviendo a 127.0.0.1
Solo un reinicio forzado de la máquina puede resolver la situación.

¿Podría ser un problema de adaptador de red?

ACTUALIZACIÓN 1

Sucedió de nuevo y parecía haberse resuelto cuando reinicié el servidor de correo. Aunque extraño, todos los contadores mostraron ~ 1000 conexiones con ~ 500 activas en este momento, y aún el error de socket 10055 al intentar conectarse a la base de datos que no tiene nada que ver con el servidor de correo.

ACTUALIZACIÓN 2 Esto ES extraño, pero el reinicio diario de los servicios de correo soluciona el problema por completo.

CamaroSS
fuente
2
Acerca de la ACTUALIZACIÓN 2. Entonces, esto simplemente indica que los servicios de correo generan demasiadas conexiones sin cerrarlas y no resolvió el problema, sino que lo oculta hasta que empeora y se requerirán 2 reinicios por día en algún momento ... Parece oculto en lugar de resolver problema ...
Mikhail

Respuestas:

9

He tenido un problema similar con el conjunto agotado de puertos TCP / IP en WinSvr 2012R2 x64 durante casi 1 mes, donde el servidor dejó de recibir conexiones nuevas y TCP. Así que jugué con los valores del registro y estos son estables para mí:

[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 : debe estar en estado predeterminado ampliado al máximo = 16777214 debe evitar que el servidor agote los puertos efímeros.
  • TcpMaxDataRetransmissions : límite de tiempo de espera de retransmisión de segmentos de datos TCP no reconocidos en la conexión real = 5.

En resultado igual que el tuyo. Creo que debería considerar auditar su comportamiento del rendimiento de sus aplicaciones / scripts. Si todo está bien y nada ayuda, puede intentar colocar el servidor proxy antes que el servidor de aplicaciones web, hacer 2 nodos con el servidor web (IIS, Apache, ...) que compartirán el mismo contenido estático y accederán a la misma base de datos al mismo tiempo tiempo (si tiene suficientes recursos en su empresa).

Quizás este artículo te ayude de alguna manera: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it- s-important.aspx

MyKE
fuente
1
Deberías haber leído la pregunta detenidamente antes de responder. Por supuesto, probé esta solución antes de preguntar, es muy común. Ya he resuelto el problema por otros medios.
CamaroSS
1
Creo que el reinicio diario de los servicios de correo no está resuelto. ¿Has encontrado otra solución?
MyKE
3
@CamaroSS: comparta su solución (si va más allá de "reiniciar el servicio de correo", esta no es una solución). Además, tal vez deberías apreciarlo un poco más si alguien trata de ayudarte.
Sven
@CamaroSS Y si lees atentamente mi respuesta, verás "En resultado igual que el tuyo", entonces
publiqué
1
¿La configuración MaxUserPortaún funciona en 2012? Pensé que en 2012 debes hacerlo a través de netsh. por ejemplo:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx
4

Además de la configuración del controlador Tcpip, el rango de puerto TCP efímero se administra en Windows Server utilizando el comando netsh ( fuente ).

Puede ver el rango dinámico de puertos con los siguientes comandos:

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

Para cambiar el rango de puertos, use este comando:

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

Por ejemplo:

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

La configuración (inicio = 49152 num = 16384 ) también es la predeterminada en Windows Server 2008 en adelante.

rustyx
fuente
Muchas gracias por esto, ya he pasado horas tratando de resolver mi problema. Todo el consejo que pude encontrar fue sobre el ajuste de MaxUserPort en el registro y nadie mencionó netsh.
milosz
3

Tuve este mismo problema en Windows Server 2016 ejecutando grandes cantidades de pruebas de Selenium con chromewebdriver. Este script PS configurará automáticamente la configuración que @Myke compartió anteriormente. El shutdowncomando se agregó porque se requiere un reinicio para los cambios de la pila TCP.

Aumente el tamaño de la agrupación para puertos TCP efímeros

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

Este fue el mensaje de error que recibimos al Webdriver.Quit()decirnos que una dirección TCP estaba en uso.

Error : EADDRINUSE conecta EADDRINUSE 127.0.0.1:12843 en ClientRequest. (\ node_modules \ selenium-webdriver \ http \ index.js: 238: 15)
De : Tarea: WebDriver.quit ()

SliverNinja - MSFT
fuente
1

¿Se ha asegurado de que no está perdiendo objetos de conexión de base de datos? Debe cerrar cada conexión de base de datos que se abra, ya sea explícitamente (con try-finally) o con un bloque using {}. Este es un problema común que ASP no le informará directamente.

James
fuente
Es un montón de sitios PHP, la mayoría de ellos se ejecutan a través de FastCGI utilizando una conexión persistente, por lo que no debería ser el caso. Si lo fuera, los contadores del sistema devolverían valores mucho más altos. Tampoco puedo explicar por qué localhost se detiene repentinamente para resolverse en :: 1 y se resuelve en 127.0.0.1.
CamaroSS
2
:: 1 desaparecer es probablemente solo un efecto secundario de desbordar los puertos permitidos. Sospecho que Windows intenta un ping IPv6 y cuando no puede obtener un puerto para intentarlo, vuelve a caer a IPv4. PHP está fuera de mis áreas de especialización. :-(. ¡Buena suerte!
James