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 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

par
fonte
Se você entender por que ele entra no estado TIME_OUT, deverá entender por que isso é necessário para evitar outros ataques e problemas. Você pode reduzir esse tempo limite, mas há outras consequências para fazer isso.
davr
A sintaxe é KeepAlive on|off. KeepAlive 0é a sintaxe do Apache 1.1; Presumo que você não esteja usando isso.
mark4o
A sessão de 1500 T / O não deixa seu sistema sem resposta. Há outra razão.
poige
As conexões estão passando por um roteador barato?
LatinSuD 12/06

Respostas:

7

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 sysctlpara reduzir o net.inet.tcp.mslvalor para metade da TIME_WAITduração desejada (em milissegundos - veja man -S 4 tcp), por exemplo sysctl net.inet.tcp.msl=2500. Cuidado com as implicações de fazê-lo com relação aos pacotes errantes que podem chegar após o TIME_WAITperíodo decorrido.

vladr
fonte
Nosso servidor roda o Ubuntu, eu atualizei os detalhes
par
«1200 - 1500 deles» não Hurn, mesmo calculadora, por isso não é a razão para sintonizar MSL
poige
1

Eu suponho que você quis dizer TIME_WAIT. O ponto que inicia o fechamento ativo é aquele que entra TIME_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_WAITpara o cliente. Veja esta resposta para obter mais detalhes e um link para um bom artigo sobre TIME_WAITproblemas 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 RSTseja enviado em vez de FIN.

Len Holgate
fonte
Oh, muito obrigado! Mas como posso controlar a conexão TCP / IP quando o usuário carrega um arquivo XML com o Internet Explorer?
par
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á dentro TIME_WAIT, consome alguns recursos, mas isso não significa que a conexão ainda está aberta ou que o servidor ainda está processando-a.
precisa saber é o seguinte
0

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 closeo soquete nesse ponto. O sistema deve ser capaz de lidar com dezenas de milhares de conexões no estado TIME_WAIT.

David Schwartz
fonte