Stack Overflow Careers est servi comme suit:
user -> internet -> our fw -> nginx -> haproxy -> web farm
- FreeBSD est le système d'exploitation utilisé
- aucun pare-feu ou QoS n'est en place sur cette boîte
- nginx gère notre terminaison SSL
- haproxy gère l'équilibrage de charge
- nginx / haproxy poussent environ 15 Mbps dans chaque sens
Pendant le fonctionnement normal, nginx reçoit la requête HTTP, fait son travail et transmet la requête à une instance haproxy qui est liée à l'adresse de bouclage (127.0.0.1) sur cette même boîte.
Afin de résoudre certains problèmes l'autre jour, j'ai déplacé l'instance haproxy sur la même interface que nginx fonctionnait. Cela a immédiatement ajouté 100 ms de latence à toutes les demandes. Cette interface n'est pas une véritable interface physique, mais une interface carpe .
Quelqu'un peut-il m'expliquer pourquoi c'était le cas? Contention avec la file d'attente de paquets peut-être? Ou peut-être que le bouclage est toujours plus rapide parce qu'il est «doux»? Il y a quelque chose de fondamental qui me manque ici, et j'espère que quelqu'un va bien m'éduquer.
la source
Réponses:
Un délai constant de 100 ms semble étrange. Il semble que les paquets soient mis en mémoire tampon et ne soient pas immédiatement livrés. Ou peut-être que certains d'entre eux sont abandonnés et retransmis. Pouvez-vous exécuter tcpdump sur cette interface pour montrer le problème? Je ne sais pas comment fonctionne la pile IP sur FreeBSD, ni comment CARP est implémenté, mais serait-il possible par exemple que l'esclave annonce régulièrement son adresse MAC avec des ARP gratuits et que le maître envoie alternativement des paquets de chaque côté?
Pourriez-vous également exécuter tcpdump sur la véritable interface pour vous assurer que rien n'est émis?
Est-il possible que le système s'abstienne de mettre en cache l'entrée ARP d'un périphérique CARP, provoquant ainsi l'émission d'une demande ARP pour chaque paquet d'une session, à laquelle le démon CARP devrait répondre?
La plupart de ces idées sont stupides, mais c'est pour vous aider à chercher dans la bonne direction.
la source
Pour plus de clarté, vous avez seulement changé la façon dont il était accédé, de l'adresse 127 à l'adresse IP locale; correct?
Si c'est le cas et que cela a fait une différence, quelque chose ne va pas. Vérifiez votre table de routage avec
netstat -rn
et voyez à quoi les adresses IP locales sont routées, elle doit être routée vers l'interface lo0 (tout comme 127).Votre
netstat -rn
sortie devrait être vaguement similaire à ceci:la source
J'ai vu le bouclage implémenté comme un logiciel i / f de niveau d'interruption tel que le trafic ne sort jamais des sentiers battus. Cela aurait-il pu être le cas lorsque vous exécutiez un bouclage? Avertissement: Juste une question générale; Je ne connais rien à FreeBSD.
- pete
la source