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

8

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.

Michael Gorsuch
quelle
1
Ein Paket, das an eine On-Box-Adresse gesendet wird, unabhängig davon, ob es über lo oder einen e {th, n} -Port adressiert wird, trifft unter Linux niemals auf die Hardware. Ich kann jedoch nicht verbindlich über BSD sprechen.
BMDan
Sind Sie sicher, dass Sie es auf dieselbe Schnittstelle umgestellt haben? Sind die 100 ms verschwunden, als Sie Haproxy wieder auf Loopback umgestellt haben?
Tomjedrz
@ Tomjedrz - ja. Sobald ich zurückschaltete, war die Latenz weg.
Michael Gorsuch

Antworten:

2

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.

Willy Tarreau
quelle
Danke für die Ideen, Willy. Ich verschiebe die Konfiguration außerhalb der Geschäftszeiten zurück auf die Schnittstelle und sehe, was eine Paketverfolgung ergibt.
Michael Gorsuch
1

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 -rnund sehen Sie, wohin die lokalen IPs weitergeleitet werden. Sie sollte an die lo0-Schnittstelle weitergeleitet werden (genau wie 127).

Ihre netstat -rnAusgabe sollte ungefähr vage ähnlich sein:

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.
quelle
Ich hätte dies in den Beitrag aufnehmen sollen: Diese Schnittstellen sind Karpfenschnittstellen. Ich war völlig außer mir, bis ich netstat lief. Macht das einen Unterschied?
Michael Gorsuch
Ja, das ist es genau dort. Wenn die von Ihnen verwendete Adresse einer Karpfenschnittstelle zugewiesen wird, die diese IP verwendet, wird sie durch den Karpfenstapel gezwungen, bevor sie auf das Loopback-Gerät trifft. 100ms wären aber immer noch übertrieben. Ist der betreffende Host der Master dieser IP oder verwenden Sie den Lastenausgleich? Es könnte den Verkehr zum anderen Karpfenwirt schicken.
Chris S
Der Host ist der Master dieser IP.
Michael Gorsuch
Ich habe gerade eine ähnliche Umgebung erstellt und getestet. Ich sah keinen nennenswerten Unterschied in den Antwortzeiten zwischen der IP der Karpfenschnittstelle, der IP 127 und einer physischen IP. Ich habe hier nur einen Server zum Testen, also keine Karpfen-Sklaven, aber ich vermute, dass an anderer Stelle in Ihrer Umgebung etwas nicht stimmt (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 nachlässt. Das aktuelle System verwendet kein Firewall-Paket und führt keine Traffic-Shaping durch. 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 Traffic erhalten. Während der normalen Stunden bewegen wir uns jeweils um 15 Mbit / s.
Michael Gorsuch
0

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

Pete Wilson
quelle
Dies funktioniert in FreeBSD nicht so.
Chris S