¿Por qué hay menos latencia en el bucle invertido que en una interfaz de carpa?

8

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.

Michael Gorsuch
fuente
1
Un paquete enviado a una dirección en la caja, ya sea a través de lo o un puerto e {th, n}, nunca llega al hardware en Linux, independientemente. Sin embargo, no puedo hablar con autoridad con respecto a BSD.
BMDan
¿Estás seguro de que lo cambiaste a la misma interfaz? ¿Se fueron los 100ms cuando cambiaste el haproxy a loopback?
tomjedrz
@tomjedrz: sí. Tan pronto como cambié, la latencia había desaparecido.
Michael Gorsuch

Respuestas:

2

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.

Willy Tarreau
fuente
Gracias por las ideas, Willy. Muevo la configuración a la interfaz fuera de horario y veo cómo aparece un rastreo de paquetes.
Michael Gorsuch
1

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 -rny vea hacia dónde se enrutan las IP locales, debe enrutarse a la interfaz lo0 (al igual que 127).

Su netstat -rnsalida debe ser vagamente similar a esto:

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
fuente
Debería haber incluido esto en la publicación: estas interfaces son interfaces de carpa. Me perdí por completo hasta que corrí netstat. Eso hace una diferencia?
Michael Gorsuch
Sí, eso es todo. Si la dirección que está usando está asignada a una interfaz de carpa que usa esa IP, la forzará a atravesar la pila de carpas antes de que llegue al dispositivo de bucle invertido; Sin embargo, 100 ms sería excesivo aún. ¿El host en cuestión es el maestro de esa IP o está utilizando el equilibrio de carga? Podría estar enviando el tráfico al otro host de carpas.
Chris S
El host es el maestro de esa IP.
Michael Gorsuch
Acabo de terminar de crear un entorno similar y probarlo. No vi ninguna diferencia apreciable en los tiempos de respuesta entre la interfaz de carpa IP, 127 IP y una IP física. Solo tengo un servidor aquí para probar, así que no hay esclavos de carpas, pero sospecho que algo anda mal en algún otro lugar de su entorno (¿firewall o configuración de tráfico?) Que está causando la latencia. Este es un i386-8.1-STABLE.
Chris S
Gracias Chris Veré si puedo reunir más información cuando el tráfico disminuya. El sistema actual no está utilizando ningún paquete de firewall ni está configurando el tráfico. También debo tener en cuenta (actualizaré la pregunta original) que estamos recibiendo una gran cantidad de tráfico debido a los anuncios de trabajo que mostramos en los sitios de la familia SO. Nos movemos a unos 15 Mbps por trayecto durante las horas normales.
Michael Gorsuch
0

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

Pete Wilson
fuente
Esta no es la forma en que funciona en FreeBSD.
Chris S