O Windows Server 2012 R2 fica sem portas efêmeras, embora não deva

13

Estamos enfrentando problemas estranhos regularmente com a rede em nosso servidor dedicado. Ele executa o Windows Server 2012 R2 x64 no Xeon E5620 com 16 GB de RAM e adaptador de rede Intel 82575EB.

Observe que já ajustamos HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersos valores-chave TcpTimedWaitDelaye MaxUserPortpara 30 e 65530, respectivamente.

Em um momento aleatório, nossos sites param de responder, pelo motivo de não conseguirem se conectar a um banco de dados local. É aproximadamente 2 semanas de atividade quando esses problemas começam a ocorrer. O log do sistema começa a receber os avisos 4227 e 4231 do TCPIP. Ele declara "Uma solicitação para alocar um número de porta efêmero do espaço de porta TCP global falhou devido a todas essas portas estarem em uso".

Se eu correr

Get-Counter -Counter \TCPv4\*

ou

Get-Counter -Counter \TCPv6\*

ou

netstat -abn | find /c ":"

Eu sempre obtenho um valor razoável de 500-1500 conexões, o que não chega nem perto do limite de 65K.

Além disso, "localhost" pára de resolver para :: 1 localmente, revertendo para 127.0.0.1
Somente uma reinicialização forçada da máquina pode resolver a situação.

Poderia ser um problema no adaptador de rede?

ATUALIZAÇÃO 1

Aconteceu novamente e parecia ter sido resolvido quando reiniciei o servidor de email. Estranho, porém, todos os contadores mostraram ~ 1000 conexões com ~ 500 ativas no momento, e ainda o erro de soquete 10055 ao tentar se conectar ao banco de dados que não tem nada a ver com o servidor de email.

ATUALIZAÇÃO 2 Isso é estranho, mas a reinicialização diária dos serviços de email corrige o problema completamente.

CamaroSS
fonte
2
Sobre a ATUALIZAÇÃO 2. Portanto, isso simplesmente indica que os serviços de email geram muitas conexões sem fechá-las e você não resolveu o problema, mas apenas o oculta até que fique pior e são necessárias duas reinicializações por dia por algum tempo ... Parece mais ocultar do que resolver problema ...
Mikhail

Respostas:

9

Eu tive um problema semelhante com o pool esgotado de portas TCP / IP no WinSvr 2012R2 x64 por quase 1 mês em que o servidor parou de receber qualquer conexão nova e TCP. Então, eu brinquei com os valores do registro e estes são estáveis ​​para mim:

[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 - deve estar no estado padrão estendido ao máximo = 16777214 deve impedir o servidor de esgotar as portas efêmeras.
  • TcpMaxDataRetransmissions - Limite de tempo limite da retransmissão de segmentos de dados não reconhecidos TCP na conexão real = 5.

Resultado igual ao seu. Eu acho que você deve considerar auditar seu comportamento do desempenho de seus aplicativos / scripts. Se tudo estiver ok e nada ajudar, você pode tentar colocar o servidor proxy antes do servidor de aplicativos da web, criar 2 nós com o servidor da web (IIS, Apache, ...) que compartilharão o mesmo conteúdo estático e acessarão o mesmo banco de dados ao mesmo tempo (se você tiver recursos suficientes em sua empresa).

Talvez este artigo o ajude de alguma forma: http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it- s-important.aspx

MyKE
fonte
1
Você deveria ter lido a pergunta completamente antes de responder. Claro que tentei esta solução antes de perguntar, é muito comum. Eu já resolvi o problema por outros meios.
CamaroSS 12/01
1
Eu acho que o reinício diário dos serviços de correio não está resolvido. Você encontrou outra solução?
MyKE
3
@CamaroSS: Compartilhe sua solução (se for além de "reiniciar o serviço de email" - isso não é uma solução). Além disso, talvez você deva apreciar um pouco mais se alguém tentar ajudá-lo.
Sven
@CamaroSS E se você ler carefuly minha resposta você verá "Em resultado mesmo como o seu", então eu postei uma outra informação ..
Myke
1
A configuração MaxUserPortainda funciona em 2012? Eu pensei que em 2012 você deve fazê-lo via netsh. por exemplo:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx 20/10
4

Além das configurações do driver Tcpip, o intervalo efetivo de portas TCP é gerenciado no Windows Server usando o comando netsh ( origem ).

Você pode visualizar o intervalo de portas dinâmico com os seguintes 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 alterar o intervalo de portas, use este comando:

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

Por exemplo:

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

A configuração (start = 49152 num = 16384 ) também é o padrão no Windows Server 2008 em diante.

rustyx
fonte
Muito obrigado por isso - eu já passei horas tentando resolver meu problema. Todo o conselho que pude encontrar foi sobre o ajuste do MaxUserPort no registro e ninguém mencionou netsh.
Milosz
3

Teve esse mesmo problema no Windows Server 2016 executando grandes quantidades de testes do Selenium usando o chromewebdriver. Este script PS definirá automaticamente as configurações @Myke compartilhadas acima. O shutdowncomando foi adicionado porque é necessária uma reinicialização para as alterações na pilha TCP.

Aumentar tamanho do pool para portas TCP efêmeras

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

Esta foi a mensagem de erro que estávamos recebendo ao Webdriver.Quit()nos informar que um endereço TCP estava em uso.

Erro : EADDRINUSE conecta EADDRINUSE 127.0.0.1:12843 no ClientRequest. (\ node_modules \ selenium-webdriver \ http \ index.js: 238: 15)
De : Tarefa: WebDriver.quit ()

SliverNinja - MSFT
fonte
1

Você garantiu que não está vazando objetos de conexão com o banco de dados? Você precisa fechar todas as conexões de banco de dados abertas, explicitamente (com try-finalmente) ou usando um bloco {}. Esse é um problema comum sobre o qual o ASP não informa diretamente.

James
fonte
É um monte de sites PHP, a maioria deles é executada via FastCGI usando conexão persistente, portanto não deve ser o caso. Se fosse, os contadores do sistema retornariam valores muito mais altos. Também não consigo explicar por que o localhost pára subitamente para resolver para :: 1 e resolve para 127.0.0.1.
CamaroSS
2
:: 1 desaparecer é provavelmente apenas um efeito colateral do transbordamento das portas permitidas - suspeito que o Windows tente executar um ping IPv6 e, quando não conseguir obter uma porta para fazer a tentativa, retornará ao IPv4. PHP está fora das minhas áreas de especialização. :-(. Boa sorte! #
James