Perché c'è meno latenza sul loopback che su un'interfaccia carp?


8

Stack Overflow Careers è servito in questo modo:

user -> internet -> our fw -> nginx -> haproxy -> web farm
  • FreeBSD è il sistema operativo in uso
  • nessun firewall o QoS è presente in questa casella
  • nginx gestisce la nostra terminazione SSL
  • haproxy gestisce il bilanciamento del carico
  • nginx / haproxy stanno spingendo di circa 15 Mbps a tratta

Durante il normale funzionamento, nginx riceve la richiesta HTTP, fa la sua cosa e passa la richiesta a un'istanza haproxy associata all'indirizzo di loopback (127.0.0.1) su quella stessa casella.

Per fare un po 'di risoluzione dei problemi l'altro giorno, ho spostato l'istanza haproxy sulla stessa interfaccia su cui nginx era in esecuzione. Ciò ha aggiunto immediatamente 100 ms di latenza a tutte le richieste. Questa interfaccia non è una vera interfaccia fisica, ma un'interfaccia carpa .

Qualcuno può spiegarmi perché è stato così? È forse in conflitto con la coda dei pacchetti? O forse il loopback è sempre più veloce perché è "morbido"? C'è qualcosa di fondamentale che mi manca qui e spero che qualcuno mi educerà gentilmente.


1
Un pacchetto inviato a un indirizzo on-box, indipendentemente dal fatto che sia indirizzato tramite lo o una porta e {th, n}, non colpisce mai l'hardware in Linux. Tuttavia, non posso parlare autorevolmente riguardo a BSD.
BMDan,

Sei sicuro di averlo impostato sulla stessa interfaccia? I 100 ms sono andati via quando hai passato il daproxy al loopback?
tomjedrz,

@tomjedrz - si. non appena sono tornato, la latenza era sparita.
Michael Gorsuch,

Risposte:


2

Un ritardo costante di 100 ms sembra strano. Sembra che i pacchetti vengano bufferizzati e non immediatamente consegnati. O forse alcuni di essi vengono eliminati e ritrasmessi. Puoi eseguire tcpdump su questa interfaccia per mostrare il problema? Non so come funziona lo stack IP su FreeBSD, né come sia implementato CARP, ma sarebbe possibile ad esempio che lo slave pubblicizzi regolarmente il suo indirizzo MAC con ARP gratuiti e che il master invii alternativamente pacchetti da ogni parte?

Potresti anche eseguire tcpdump sulla vera interfaccia per garantire che non venga emesso nulla?

È possibile che il sistema si astiene dal memorizzare nella cache la voce ARP di un dispositivo CARP, causando così l'emissione di una richiesta ARP per ogni pacchetto di una sessione, a cui il demone CARP dovrebbe rispondere?

La maggior parte di queste sono idee stupide, ma è per aiutarti a cercare nella giusta direzione.


Grazie per le idee, Willy. Sposto la configurazione di nuovo fuori dall'interfaccia e vedo cosa viene visualizzata una traccia di pacchetto.
Michael Gorsuch,

1

Per chiarezza, hai cambiato solo il modo in cui si accedeva, dall'indirizzo 127, all'IP locale; corretta?

Se questo è il caso e ha fatto la differenza, qualcosa non va. Controlla la tua tabella di routing con netstat -rne guarda a quali indirizzi IP sono indirizzati, dovrebbe essere indirizzato all'interfaccia lo0 (proprio come 127).

L' netstat -rnoutput dovrebbe essere vagamente simile a questo:

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

Avrei dovuto includerlo nel post: queste interfacce sono interfacce carpa. Mi è completamente passato di mente finché non ho corso netstat. Questo fa la differenza?
Michael Gorsuch,

Sì, è tutto lì. Se l'indirizzo che stai utilizzando è assegnato a un'interfaccia carp usando quell'IP, lo forzerà attraverso lo stack di carpe prima che colpisca il dispositivo di loopback; 100ms sarebbero comunque eccessivi. L'host in questione è il master di quell'IP o stai usando il bilanciamento del carico? Potrebbe inviare il traffico all'altro host di carpe.
Chris S,

L'host è il padrone di quell'IP.
Michael Gorsuch,

Ho appena finito di creare un ambiente simile e testarlo. Non ho riscontrato differenze apprezzabili nei tempi di risposta tra l'interfaccia IP della carpa, 127 IP e un IP fisico. Ho solo un server qui da testare, quindi niente carpa, ma sospetto che qualcosa non vada altrove nel tuo ambiente (firewall o traffic shaping?) Che sta causando la latenza. Questo è un i386-8.1-STABILE.
Chris S,

Grazie Chris. Vedrò se riesco a raccogliere più informazioni quando il traffico si interrompe. Il sistema attuale non utilizza alcun pacchetto firewall o modifica del traffico. Dovrei anche notare (aggiornerò la domanda originale) che stiamo ricevendo una grande quantità di traffico a causa degli annunci di lavoro che stiamo visualizzando sui siti della famiglia SO. Ci stiamo muovendo di circa 15 Mbps a tratta durante le normali ore.
Michael Gorsuch,

0

Ho visto il loopback implementato come un software a livello di interruzione i / f in modo tale che il traffico non uscisse mai fuori dagli schemi. Potrebbe essere stato così quando stavi eseguendo il loopback? Disclaimer: solo una domanda generale; Non so nulla di FreeBSD.

- pete


Questo non è il modo in cui funziona in FreeBSD.
Chris S,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.