Stack Overflow Careers wird in etwa so serviert:
user -> internet -> our fw -> nginx -> haproxy -> web farm
- FreeBSD ist das verwendete Betriebssystem
- Auf dieser Box ist keine Firewall oder QoS vorhanden
- nginx kümmert sich um unsere SSL-Kündigung
- Haproxy übernimmt den Lastausgleich
- nginx / haproxy pushen ungefähr 15 Mbit / s pro Weg
Während des normalen Betriebs empfängt nginx die HTTP-Anforderung, erledigt ihre Aufgabe und übergibt die Anforderung an eine Haproxy-Instanz, die an die Loopback-Adresse (127.0.0.1) in derselben Box gebunden ist.
Um neulich eine Fehlerbehebung durchzuführen, habe ich die Haproxy-Instanz auf dieselbe Schnittstelle verschoben, auf der Nginx ausgeführt wurde. Dies führte sofort zu einer Latenz von 100 ms für alle Anforderungen. Diese Schnittstelle ist keine echte physische Schnittstelle, sondern eine Karpfenschnittstelle .
Kann mir jemand erklären, warum das so war? Streit mit der Paketwarteschlange vielleicht? Oder ist Loopback vielleicht immer schneller, weil es "weich" ist? Es gibt etwas Grundlegendes, das mir hier fehlt, und ich hoffe, dass mich jemand freundlich erziehen wird.
quelle
Antworten:
Eine konstante Verzögerung von 100 ms sieht komisch aus. Es sieht so aus, als würden Pakete gepuffert und nicht sofort zugestellt. Oder vielleicht werden einige von ihnen fallen gelassen und erneut übertragen. Können Sie tcpdump auf dieser Schnittstelle ausführen, um das Problem anzuzeigen? Ich weiß nicht, wie der IP-Stack unter FreeBSD funktioniert oder wie CARP implementiert ist, aber wäre es beispielsweise möglich, dass der Slave seine MAC-Adresse regelmäßig mit kostenlosen ARPs ankündigt und der Master alternativ Pakete an jede Seite sendet?
Könnten Sie tcpdump auch auf der realen Schnittstelle ausführen, um sicherzustellen, dass nichts ausgegeben wird?
Ist es möglich, dass das System den ARP-Eintrag eines CARP-Geräts nicht zwischenspeichert, wodurch für jedes Paket einer Sitzung eine ARP-Anforderung ausgegeben wird, die der CARP-Dämon beantworten müsste?
Die meisten davon sind einige dumme Ideen, aber sie sollen Ihnen helfen, in die richtige Richtung zu suchen.
quelle
Aus Gründen der Übersichtlichkeit haben Sie nur den Zugriff von der 127-Adresse auf die lokale IP-Adresse geändert. richtig?
Wenn das der Fall ist und es einen Unterschied macht, stimmt etwas nicht. Überprüfen Sie Ihre Routing-Tabelle mit
netstat -rn
und sehen Sie, wohin die lokalen IPs weitergeleitet werden. Sie sollte an die lo0-Schnittstelle weitergeleitet werden (genau wie 127).Ihre
netstat -rn
Ausgabe sollte ungefähr vage ähnlich sein:quelle
Ich habe gesehen, dass Loopback als Interrupt-Software-I / F implementiert wurde, sodass der Datenverkehr nie über den Tellerrand hinausgeht. Könnte dies der Fall gewesen sein, als Sie Loopback ausgeführt haben? Haftungsausschluss: Nur eine allgemeine Frage; Ich weiß nichts über FreeBSD.
- Peter
quelle