Por que há menos latência no loopback do que na interface carp?

8

O Stack Overflow Careers é exibido da seguinte forma:

user -> internet -> our fw -> nginx -> haproxy -> web farm
  • O FreeBSD é o sistema operacional em uso
  • nenhum firewall ou QoS existe nesta caixa
  • O nginx lida com nossa terminação SSL
  • haproxy lida com o balanceamento de carga
  • nginx / haproxy estão aumentando cerca de 15 Mbps em cada sentido

Durante a operação normal, o nginx recebe a solicitação HTTP, faz sua parte e entrega a solicitação a uma instância haproxy vinculada ao endereço de loopback (127.0.0.1) na mesma caixa.

Para solucionar alguns problemas no outro dia, mudei a instância haproxy para a mesma interface em que o nginx estava sendo executado. Isso adicionou imediatamente 100ms de latência a todas as solicitações. Essa interface não é uma interface física verdadeira, mas uma interface de carpa .

Alguém pode me explicar por que esse foi o caso? Contenção com a fila de pacotes, talvez? Ou talvez o loopback seja sempre mais rápido porque é 'suave'? Estou perdendo algo fundamental aqui, e espero que alguém me educe gentilmente.

Michael Gorsuch
fonte
1
Um pacote enviado para um endereço na caixa, endereçado por lo ou por uma porta n, nunca atinge o hardware no Linux, independentemente. Não posso falar com autoridade no que diz respeito ao BSD.
BMDan
Você tem certeza de que mudou para a mesma interface? Os 100ms desapareceram quando você trocou o haproxy de volta ao loopback?
#
@tomjedrz - sim. Assim que voltei, a latência se foi.
Michael Gorsuch

Respostas:

2

Um atraso constante de 100 ms parece estranho. Parece que os pacotes são armazenados em buffer e não são entregues imediatamente. Ou talvez alguns deles sejam descartados e retransmitidos. Você pode executar o tcpdump nessa interface para mostrar o problema? Não sei como a pilha de IPs funciona no FreeBSD, nem como o CARP é implementado, mas seria possível, por exemplo, que o escravo anuncie regularmente seu endereço MAC com ARPs gratuitos e que o mestre envie pacotes alternativamente para cada lado?

Você também pode executar o tcpdump na interface real para garantir que nada seja emitido?

É possível que o sistema evite armazenar em cache a entrada ARP de um dispositivo CARP, fazendo com que uma solicitação ARP seja emitida para cada pacote de uma sessão, que o daemon CARP precisaria responder?

A maioria dessas são idéias estúpidas, mas é para ajudá-lo a pesquisar na direção certa.

Willy Tarreau
fonte
Obrigado pelas idéias, Willy. Movo a configuração de volta para a interface fora do horário comercial e vejo o que um rastreamento de pacote aparece.
Michael Gorsuch
1

Apenas para maior clareza, você apenas mudou a maneira como estava sendo acessado, do endereço 127 para o IP local; corrigir?

Se for esse o caso e fez a diferença, algo não está certo. Verifique sua tabela de roteamento netstat -rne veja para onde os IPs locais são roteados, eles devem ser roteados para a interface lo0 (assim como 127).

Sua netstat -rnsaída deve ser vagamente semelhante a esta:

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            1.2.3.1            UGS       131  2655014   nge1
1.2.3.0/23         link#2             U           0       88   nge1
1.2.3.4            link#2             UHS         0    34848    lo0
127.0.0.1          link#5             UH          0    64678    lo0
192.168.0.0/26     link#1             U           2 41703537   nge0
192.168.0.1        link#1             UHS         0    70088    lo0
Chris S
fonte
Eu deveria ter incluído isso no post: essas interfaces são interfaces carp. Deslizei completamente minha mente até que eu corri netstat. Isso faz diferença?
Michael Gorsuch
Sim, é isso aí. Se o endereço que você está usando for atribuído a uma interface carp usando esse IP, forçará o usuário a atravessar a pilha carp antes de atingir o dispositivo de loopback; 100ms seria excessivo ainda. O host em questão é o mestre desse IP ou você está usando balanceamento de carga? Pode estar enviando o tráfego para o outro hospedeiro de carpa.
Chris S
O host é o mestre desse IP.
Michael Gorsuch
Acabei de criar um ambiente semelhante e testá-lo. Não vi diferença significativa nos tempos de resposta entre o IP da interface carp, 127 IP e um IP físico. Eu só tenho um servidor aqui para testar, então não há escravos da carpa, mas suspeito que algo esteja errado em outro lugar do seu ambiente (firewall ou modelagem de tráfego?) Que esteja causando a latência. Este é um i386-8.1-STABLE.
Chris S
Obrigado Chris. Vou ver se consigo reunir mais informações quando o tráfego diminuir. O sistema atual não está usando nenhum pacote de firewall ou fazendo nenhuma modelagem de tráfego. Devo também observar (atualizará a pergunta original) que estamos recebendo uma grande quantidade de tráfego devido aos anúncios de vagas que estamos exibindo nos sites da família SO. Estamos movendo cerca de 15 Mbps em cada sentido durante o horário normal.
Michael Gorsuch
0

Vi o loopback implementado como um software de nível de interrupção i / f, de modo que o tráfego nunca sai da caixa. Poderia ter sido esse o caso quando você estava executando o loopback? Isenção de responsabilidade: apenas uma pergunta geral; Não sei nada sobre o FreeBSD.

- pete

Pete Wilson
fonte
Não é assim que funciona no FreeBSD.
Chris S