O que causa um atraso de 100 ms ao iniciar uma conexão HTTP?

4

Configurações: esta é uma máquina com quatro CPUs, muito strong, não carregada (nem CPU nem rede), o cliente é um servidor Windows Server 2008 de 64 bits, o servidor é uma caixa linux.

Eu tenho quatro threads que estão emitindo solicitações HTTP iniciando ao mesmo tempo. As conexões são iniciadas para os IPs X, X, Y, Z (duas conexões para X, uma para Y e Z). Todos os alvos estão na LAN local.

Estou vendo que as conexões para X, Y e Z são formadas (SYN-SYN / ACK) e a segunda conexão para X é com um atraso de 100 ms. Ou seja, a máquina não está enviando o segundo SYN para X por 100 ms.

Isso pode estar relacionado ao Motor TCP Offload ? O que mais poderia estar causando esse atraso?

Editar - Outro suspeito é o código do cliente - está escrito em Java e usa o HttpURLConnection.

    
por ripper234 09.12.2009 / 15:33

6 respostas

4

Um rastreamento de rede (por exemplo, Wireshark) mostrará se o atraso está aguardando uma resposta. Também indicaria outros "desvios", como a sugestão sobre o DNS. Parece que você já fez isso, mas não disse.

    
por 09.12.2009 / 18:03
3

Uma possibilidade diferente: o limite do Windows XP SP2 em conexões abertas pela metade, cujo padrão é 10. Não sei como você vê quantas conexões estão nesse estado, mas acredito que se esse limitador de taxa entrar em ação ele aparecerá nos registros de erros.

Half-open.com

    
por 10.12.2009 / 12:55
2

Será necessário fazer uma pesquisa de DNS para cada solicitação? Isso limita a taxa?

    
por 09.12.2009 / 17:09
1

A conexão inicial passa bem, mas é sua segunda conexão que está sendo enfileirada. Eu revisaria a implementação do cliente no software, não sei se os JDKs mais recentes fizeram mais alterações, mas costumava ser que, mesmo que você fizesse HttpUrlConnections individuais, o Manipulador de Protocolos subjacente ainda usaria novamente a conexão de soquete.

Você deve fazer o check-in no StackOverflow e ver se alguns deles já lidaram com esse problema antes.

    
por 09.12.2009 / 18:50
1

OK, há muitos lugares possíveis que podem estar dando errado. Você mencionou o mecanismo de descarregamento do TCP, e esse é um suspeito razoável (especialmente se você tiver NICs da Broadcom lá), então vamos descartá-lo e desativá-lo (consulte sua documentação para isso).

Depois disso, você quer começar a reduzir outros possíveis candidatos, então olhe para switches, cabos de rede e assim por diante. Se puder, conecte a origem ao destino por meio de um cruzamento e veja se consegue reproduzi-lo lá.

Também vale a pena tentar o velho e querido ping - pelo que parece, você deve ser capaz de reproduzir o comportamento aberrante com 4 pings simultâneos.

Mas o que se resume é que não há sentido em suspeitar de qualquer coisa neste estágio inicial, pois há muitos lugares em que poderia estar errado (incluindo seu aplicativo).

    
por 09.12.2009 / 21:17
0

Você verificou suas configurações de firewall? Pode haver algo nas configurações do firewall que limitem as conexões.

Você tem alguma configuração especial de sysctl para o servidor? Há muitos pequenos ajustes que um pode fazer pela rede em sysctl.

Você verificou em servidores / clientes diferentes? Isso serve para ajudar a isolar a causa do problema - seja o servidor específico, o cliente ou ambos.

    
por 09.12.2009 / 16:19