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.
fonte
Respostas:
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.
fonte
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 -rn
e veja para onde os IPs locais são roteados, eles devem ser roteados para a interface lo0 (assim como 127).Sua
netstat -rn
saída deve ser vagamente semelhante a esta:fonte
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
fonte