Posso fazer com que a sessão TCP / IP seja executada em menos de 60 segundos?

8

Nosso servidor está sobrecarregado com sessões TCP / IP, temos 1200 - 1500 deles. 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.

Eu 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 então vejo que a conexão TCP / IP está no estado TIME_OUT por 60 segundos.

Existe alguma maneira de se livrar de TIME_OUT esperando ou diminuir o tempo para o socket 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 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, o controle Flash ActiveX incorporado no aplicativo do Windows).

SO: Ubuntu

A opção "Keep Alive" do Apache está definida como 0

    
por par 05.04.2010 / 17:29

3 respostas

7

Esta é 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.

UPDATE

Então você está usando o Ubuntu. Você pode usar sysctl para reduzir o valor de net.inet.tcp.msl para metade da duração desejada de TIME_WAIT (em milissegundos - consulte man -S 4 tcp ), por exemplo %código%. Cuidado com as implicações de fazê-lo em relação aos pacotes errantes que podem chegar após o período de sysctl net.inet.tcp.msl=2500 .

    
por 05.04.2010 / 17:37
1

Suponho que você queira dizer TIME_WAIT . O par que inicia o fechamento ativo é aquele que entra em TIME_WAIT (veja o diagrama de transição de estados aqui ) então se você puder fazer com que seu cliente feche a conexão, então você moverá o TIME_WAIT off para o cliente. Veja esta resposta para mais detalhes e um link para um bom artigo sobre TIME_WAIT de problemas e como resolvê-los.

Outra alternativa, se você não puder fazer o cliente emitir 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 de FIN .

    
por 05.04.2010 / 20:35
0

O servidor que não está respondendo 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 deve há muito tempo ter close d o soquete nesse ponto. O sistema deve ser capaz de lidar com dezenas de milhares de conexões no estado TIME_WAIT.

    
por 16.09.2011 / 02:53