Frage Warum gibt es beim Loopback weniger Latenz als bei einer Karpfenschnittstelle?


Überlauf Karriere ist so etwas serviert:

user -> internet -> our fw -> nginx -> haproxy -> web farm
  • FreeBSD ist das verwendete Betriebssystem
  • Auf dieser Box ist keine Firewall oder QoS vorhanden
  • nginx behandelt unsere SSL-Terminierung
  • haproxy kümmert sich um den Lastenausgleich
  • Nginx / Haproxy drücken etwa 15 Mbps in jeder Richtung

Während des normalen Betriebs empfängt nginx die HTTP-Anfrage, erledigt seine Aufgabe und übergibt die Anfrage an eine haproxy-Instanz, die an die Loopback-Adresse (127.0.0.1) derselben Box gebunden ist.

Um neulich Fehler zu beheben, habe ich die haproxy-Instanz auf dieselbe Schnittstelle verschoben, auf der nginx lief. Dadurch wurde allen Anforderungen sofort eine Wartezeit von 100 ms hinzugefügt. Diese Schnittstelle ist keine echte physikalische Schnittstelle, sondern ein Karpfenschnittstelle.

Kann mir jemand erklären, warum das so war? Konkurrenz mit der Paketwarteschlange vielleicht? Oder vielleicht Loopback ist immer schneller, weil es "weich" ist? Es gibt etwas Grundlegendes, dass ich hier vermisse, und ich hoffe, dass jemand mich freundlich erzieht.


8
2017-07-23 15:16


Ursprung


Ein Paket, das an eine Postfachadresse gesendet wird, unabhängig davon, ob es über einen oder einen Port adressiert ist, trifft unter Linux niemals die Hardware. Ich kann jedoch nicht verbindlich in Bezug auf BSD sprechen. - BMDan
Bist du sicher, dass du es auf dieselbe Schnittstelle geschaltet hast? Sind die 100ms weg, als du Haproxy zurück zum Loopback geschaltet hast? - tomjedrz
@tomjedrz - ja. Sobald ich zurückgeschaltet hatte, war die Latenz weg. - Michael Gorsuch


Antworten:


Eine konstante Verzögerung von 100 ms sieht komisch aus. Es sieht so aus, als würden Pakete gepuffert und nicht sofort geliefert. Oder vielleicht werden einige von ihnen fallengelassen und erneut übertragen. Kannst du tcpdump darauf ausführen? Schnittstelle, um das Problem zu zeigen? Ich weiß nicht, wie der IP-Stack unter FreeBSD funktioniert und wie CARP implementiert ist, aber wäre es zum Beispiel 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 Oberfläche ausführen, um sicherzustellen, dass nichts ausgegeben wird?

Ist es möglich, dass das System den ARP-Eintrag eines CARP-Geräts nicht zwischenspeichert und somit für jedes Paket einer Sitzung, die der CARP-Daemon beantworten müsste, eine ARP-Anfrage ausgegeben wird?

Die meisten davon sind einige dumme Ideen, aber es ist, um Ihnen zu helfen, in die richtige Richtung zu suchen.


2
2017-07-24 06:04



Danke für die Ideen, Willy. Ich verschiebe die Konfiguration zurück in die Off-Stunden-Schnittstelle und sehe, was eine Paket-Trace auftaucht. - Michael Gorsuch


Aus Gründen der Übersichtlichkeit haben Sie lediglich den Zugriff auf die Adresse von 127 auf die lokale IP-Adresse geändert. richtig?

Wenn das der Fall ist und es einen Unterschied gemacht hat, stimmt etwas nicht. Überprüfen Sie Ihre Routing-Tabelle mit netstat -rn und sehen, wohin die lokalen IPs geroutet werden, sollte es an die lo0-Schnittstelle weitergeleitet werden (genau wie 127).

Ihre netstat -rn Die Ausgabe sollte ungefähr wie folgt aussehen:

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

1
2017-07-23 15:20



Ich hätte das in die Post aufnehmen sollen: Diese Schnittstellen sind Karpfenschnittstellen. Völlig vergessen, bis ich Netstat lief. Macht das einen Unterschied? - Michael Gorsuch
Ja, das ist es genau dort. Wenn die verwendete Adresse einer Carp-Schnittstelle zugewiesen ist, die diese IP verwendet, wird sie durch den Karpfenstapel gezwungen, bevor sie das Loopback-Gerät trifft. 100ms wären aber immer noch übertrieben. Ist der betreffende Host der Master dieser IP oder verwenden Sie den Lastausgleich? Es könnte den Verkehr zu dem anderen Karpfenwirt senden. - Chris S
Der Host ist der Master dieser IP. - Michael Gorsuch
Ich habe gerade eine ähnliche Umgebung ausgepeitscht und getestet. Ich sah keinen nennenswerten Unterschied in den Antwortzeiten zwischen der Carp-Schnittstelle IP, 127 IP und einer physischen IP. Ich habe hier nur einen Server zum Testen, also keine Karpfen-Sklaven, aber ich vermute, dass irgendwo anders in Ihrer Umgebung etwas schief läuft (Firewall oder Traffic-Shaping?), Was die Latenz verursacht. Dies ist ein i386-8.1-STABLE. - Chris S
Danke, Chris. Ich werde sehen, ob ich mehr Informationen sammeln kann, wenn der Verkehr abklingt. Das aktuelle System verwendet kein Firewall-Paket oder macht Traffic-Shaping. Ich sollte auch beachten (wird die ursprüngliche Frage aktualisieren), dass wir aufgrund der Stellenanzeigen, die wir auf den Websites der SO-Familie anzeigen, eine große Menge an Zugriffen erhalten. Wir bewegen uns ungefähr 15 Mbps pro Richtung während der normalen Stunden. - Michael Gorsuch


Ich habe gesehen, Loopback als Interrupt-Level-Software-I / F implementiert, so dass der Verkehr nie außerhalb der Box kommt. Könnte das der Fall gewesen sein, als Sie Loopback ausgeführt haben? Disclaimer: Nur eine allgemeine Frage; Ich weiß nichts über FreeBSD.

- Peter


0
2017-07-23 15:50



So funktioniert es in FreeBSD nicht. - Chris S