Nosso servidor está sobrecarregado com sessões TCP / IP, temos 1200 - 1500 delas. A maioria deles está pendurada no estado TIME_OUT. Acontece que uma conexão no estado TIME_OUT ocupa um soquete até que o tempo limite de 60 segundos seja decorrido.
O problema é que o servidor não responde e muitos clientes não estão sendo atendidos.
Fiz um teste simples: baixe um arquivo XML do servidor com o Internet Explorer 8.0 O download termina em uma fração de segundo. Mas vejo que a conexão TCP / IP está travando no estado TIME_OUT por 60 segundos.
Existe alguma maneira de se livrar de TIME_OUT em espera ou diminuir o tempo para liberar o soquete para novas conexões?
Entendo por que a conexão TCP / IP entra no estado TIME_OUT, mas não entendo por que o Internet Explorer não fecha a conexão após o término do download do arquivo XML.
Os detalhes.
Nosso servidor executa o serviço da Web escrito em Perl (mod-perl). O serviço fornece dados meteorológicos aos clientes. O cliente é uma aplicação Flash (na verdade, controle Flash ActiveX incorporado no aplicativo Windows).
SO: Ubuntu
A opção "Keep Alive" do Apache está definida como 0
fonte
KeepAlive on|off
.KeepAlive 0
é a sintaxe do Apache 1.1; Presumo que você não esteja usando isso.Respostas:
Essa é uma configuração na sua pilha TCP. Como não sabemos em qual plataforma você está, não podemos dizer exatamente como é chamado e como alterá-lo.
ATUALIZAR
Então você está usando o Ubuntu. Você pode usar
sysctl
para reduzir onet.inet.tcp.msl
valor para metade daTIME_WAIT
duração desejada (em milissegundos - vejaman -S 4 tcp
), por exemplosysctl net.inet.tcp.msl=2500
. Cuidado com as implicações de fazê-lo com relação aos pacotes errantes que podem chegar após oTIME_WAIT
período decorrido.fonte
Eu suponho que você quis dizer
TIME_WAIT
. O ponto que inicia o fechamento ativo é aquele que entraTIME_WAIT
(consulte o diagrama de transição de estado aqui ); portanto, se você puder fazer com que seu cliente feche a conexão, você o moveráTIME_WAIT
para o cliente. Veja esta resposta para obter mais detalhes e um link para um bom artigo sobreTIME_WAIT
problemas e como resolvê-los.Outra alternativa, se você não conseguir que o cliente emita o fechamento ativo, é redefinir a conexão definindo linger como false antes de fechá-la. Isso faz com que um
RST
seja enviado em vez deFIN
.fonte
TIME_WAIT
é normal e, a menos que o desempenho do servidor esteja sofrendo por causa disso, não é algo que me preocuparia muito. Quando o soquete está dentroTIME_WAIT
, consome alguns recursos, mas isso não significa que a conexão ainda está aberta ou que o servidor ainda está processando-a.O servidor que não responde provavelmente não tem nada a ver com o número de conexões no estado TIME_WAIT. Não está claro o que você quer dizer com "ocupa um soquete" - o servidor já deve ter
close
o soquete nesse ponto. O sistema deve ser capaz de lidar com dezenas de milhares de conexões no estado TIME_WAIT.fonte