Muitas conexões estabelecidas deixadas em aberto

3

Eu tenho um (provavelmente muito antigo) servidor CentOS 4.5 com um aplicativo java personalizado em execução.

Eu descobri que o aplicativo estava travando depois de algum tempo de execução e descobri que ele estava manipulando 1024 conexões e tentando abrir mais um soquete quando ele morreu.

De fato, se eu verificar ulimit -n , eu posso confirmar que é 1024, então o aplicativo está sendo fechado, já que não tem mais descritores de arquivos livres.

O que me incomoda é que há centenas de conexões aparentemente inativas, em um estado "ESTABLISHED OFF", tudo a partir de um número relativamente pequeno de IPs (cerca de 200), e que elas tendem a se acumular com o passar do tempo e clientes conectar, muito parecido com estes que vejo correndo netstat -nato :

tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.98:12059   ESTABLISHED off (0.00/0/0)
tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.98:49179   ESTABLISHED off (0.00/0/0)
tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.42:45907   ESTABLISHED off (0.00/0/0)

Eu sei que não é um ataque DOS, as conexões são legítimas, mas parecem não fechar após os clientes se conectarem e fazerem uma pequena troca de dados com o servidor .. além disso o ritmo é lento, já que são gerados por 200 clientes (contando IP diferente) ..

Devo investigar algum bug de aplicativo estranho (talvez no jre 1.6) ou acessar a configuração de rede do CentOS? Eu não tenho nenhuma pista sobre o que mais olhar ...

Obrigado antecipadamente, qualquer sugestão é apreciada!

    
por Luke 01.05.2013 / 19:29

1 resposta

4

Hipótese 1: seu aplicativo está por trás de um firewall que desconecta conexões tcp ociosas após um determinado período de tempo.

Quando o cliente tenta usar essa conexão novamente, ele não responde, solta e inicia um novo.

Para o servidor, como as conexões TCP não possuem um temporizador de manutenção, não há como saber se a conexão é inválida e se permanecerá aberta indefinidamente.

Para provar: faça um tcpdump de execução longa de uma conexão para mostrar que ele não é utilizado após um determinado período de tempo.

Solução:

  • Altere o código para usar o keep-alive nos soquetes tcp e (opcionalmente, para um melhor desempenho) defina o cronômetro de keep-alive como menor que o temporizador tcp-idle do firewall
  • Altere o temporizador tcp-idle do firewall para um valor mais alto além do tempo ocioso máximo funcional do cliente. Muito provavelmente, essa será uma configuração global no firewall, portanto, o administrador de segurança pode estar relutante em fazer isso.
por 01.05.2013 / 20:03