Stack Overflow Careers se sirve de la siguiente manera:
user -> internet -> our fw -> nginx -> haproxy -> web farm
- FreeBSD es el sistema operativo en uso
- no hay firewall o QoS en este cuadro
- nginx maneja nuestra terminación SSL
- haproxy maneja el equilibrio de carga
- nginx / haproxy están empujando alrededor de 15 Mbps en cada sentido
Durante el funcionamiento normal, nginx recibe la solicitud HTTP, hace lo suyo y entrega la solicitud a una instancia de haproxy que está vinculada a la dirección de bucle invertido (127.0.0.1) en ese mismo cuadro.
Para solucionar el problema el otro día, moví la instancia de haproxy a la misma interfaz en la que se estaba ejecutando nginx. Esto agregó inmediatamente 100 ms de latencia a todas las solicitudes. Esta interfaz no es una verdadera interfaz física, sino una interfaz de carpa .
¿Alguien puede explicarme por qué este fue el caso? ¿Contención con la cola de paquetes tal vez? ¿O tal vez el loopback es siempre más rápido porque es 'suave'? Hay algo fundamental que me estoy perdiendo aquí, y espero que alguien me eduque amablemente.
fuente
Respuestas:
Un retraso constante de 100 ms parece extraño. Parece que los paquetes se almacenan en el búfer y no se entregan de inmediato. O tal vez algunos de ellos se caen y se retransmiten. ¿Puedes ejecutar tcpdump en esta interfaz para mostrar el problema? No sé cómo funciona la pila IP en FreeBSD, ni cómo se implementa CARP, pero ¿sería posible, por ejemplo, que el esclavo anuncie regularmente su dirección MAC con ARP gratuitos y que el maestro envíe alternativamente paquetes a cada lado?
¿Podría también ejecutar tcpdump en la interfaz real para asegurarse de que no se emita nada?
¿Es posible que el sistema se abstenga de almacenar en caché la entrada ARP de un dispositivo CARP, causando que se emita una solicitud ARP para cada paquete de una sesión, que el demonio CARP tendría que responder?
La mayoría de esas son algunas ideas estúpidas, pero es para ayudarte a buscar en la dirección correcta.
fuente
Solo por claridad, solo cambió la forma en que se accedía, desde la dirección 127, a la IP local; ¿correcto?
Si ese es el caso y marcó la diferencia, algo no está bien. Verifique su tabla de enrutamiento
netstat -rn
y vea hacia dónde se enrutan las IP locales, debe enrutarse a la interfaz lo0 (al igual que 127).Su
netstat -rn
salida debe ser vagamente similar a esto:fuente
He visto el loopback implementado como un software de nivel de interrupción i / f tal que el tráfico nunca sale de la caja. ¿Podría haber sido el caso cuando estaba ejecutando loopback? Descargo de responsabilidad: solo una pregunta general; No sé nada sobre FreeBSD.
pete
fuente