it-swarm.com.de

Nach welchen Kriterien optimieren Sie Timeouts in der HA Proxy-Konfiguration?

Wie entscheiden Sie bei der Konfiguration von HA Proxy, welche Werte den Zeitüberschreitungen zugewiesen werden sollen? Ich habe ein halbes Dutzend Beispiele in verschiedenen Blogs gelesen, und jeder verwendet unterschiedliche Zeitüberschreitungen, und niemand diskutiert, warum.

HAProxy scheint sich speziell Sorgen um Client, Verbindung und Server zu machen, worüber HAPRoxy eine Warnung ausgibt, wenn Sie das Feld vollständig deaktivieren:

While not properly invalid, you will certainly encounter various problems
with such a configuration. To fix this, please ensure that all following
timeouts are set to a non-zero value: 'client', 'connect', 'server'.

Das Dokumentation ist in dieser Hinsicht nicht hilfreich: Es schlägt "etwas über Vielfachen von 3 Sekunden" vor, aber nicht, warum Sie ein Vielfaches von 1 gegen 100 oder 42 wählen würden.

Das von mir verwendete RPM (Amazon Linux-Repository) legt die folgenden Standardeinstellungen fest:

timeout connect         10s
timeout client          1m
timeout server          1m

Zwei davon sind exakte Vielfache von 3 Sekunden und verstoßen gegen den einzigen offiziellen Rat, den ich gesehen habe.

Wenn Sie keine spezifischen Tuning-Ratschläge haben, ist eine einfachere Frage vielleicht: Was kann ich erwarten, wenn wirklich kurze oder lange Zeitüberschreitungen auftreten?

37
Jeremy Wadhams

Das TCP RTO (Empfangszeitlimit)) beginnt nach drei Sekunden. ( RFC 1122 ) Wenn für ein übertragenes Paket keine Bestätigung zurückgegeben wurde In dieser Zeit wird angenommen, dass es verloren geht und erneut übertragen wird. Dies ist mit ziemlicher Sicherheit das, worauf sich der Autor bezieht. (Beachten Sie, dass die RTO durch verschiedene Algorithmen außerhalb des Bereichs von dynamisch nach oben oder unten eingestellt wird diese Frage.)

Beachten Sie, dass dies wirklich nur für Verbindungen zwischen Ihrem Frontend-Server und den Clients (d. H. Webbenutzern) gilt. In normalen Szenarien sollten sich die Verbindungen zwischen HAProxy und Ihren Backend-Servern in einem LAN befinden und Sie sollten viel kürzere Zeitüberschreitungen verwenden, damit fehlerhafte Backends früher außer Betrieb genommen werden.

Einige Ihrer Webbenutzer befinden sich möglicherweise in Verbindungen mit sehr hoher Latenz, z. B. über Satellit, und können aufgrund dessen höhere Übertragungen als normal aufweisen. Die RTT bei einer Verbindung, bei der ein Satellit verwendet wird, kann 2000 ms überschreiten, selbst wenn alles in Ordnung ist.

Vor diesem Hintergrund möchten Sie im Allgemeinen sehr kurze Zeitüberschreitungen für timeout connect und sehr lange für timeout client.

Zum timeout server, dies hängt von Ihrer Webanwendung ab. Berücksichtigen Sie beim Festlegen des Zeitlimits die Komplexität der bereitgestellten Webanwendung und wie lange es im schlimmsten Fall dauern kann, eine komplexe Anforderung zu verarbeiten. Wenn Sie Zweifel haben, erhöhen Sie den Wert.

43
Michael Hampton

Vorwort

Ich habe HAProxy für eine Weile optimiert und viele Leistungstests durchgeführt. Von 100 HTTP-Anforderungen bis zu 50 000 HTTP-Anforderungen.

Der erste Rat ist Aktivieren Sie die Statistikseite auf HAProxy. Sie brauchen Überwachung, keine Ausnahme. Sie müssen auch eine Feinabstimmung vornehmen, wenn Sie 10.000 Anfragen/s überschreiten möchten.

Timeouts sind ein verwirrendes Tier, weil sie eine Vielzahl möglicher Werte aufweisen, von denen die meisten keinen beobachtbaren Unterschied aufweisen. Ich habe noch nicht gesehen, dass etwas aufgrund einer um 5% niedrigeren oder 5% höheren Zahl fehlschlägt. 10000 vs 11000 Millisekunden, wen interessiert das? Wahrscheinlich nicht dein System.

Aufbau

Ich kann nicht guten Gewissens ein paar Zahlen als "beste Auszeit aller Zeiten für alle" angeben.

Was ich stattdessen sagen kann, sind die aggressivsten Zeitüberschreitungen, die für den HTTP (S) -Lastausgleich immer akzeptabel sind. Wenn Sie weniger als diese feststellen, ist es Zeit, Ihren Load Balancer neu zu konfigurieren.

timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000

timeout-Client:

Das Inaktivitätszeitlimit gilt, wenn vom Client erwartet wird, dass er Daten bestätigt oder sendet. Im HTTP-Modus ist dieses Zeitlimit besonders wichtig, um es in der ersten Phase, wenn der Client die Anforderung sendet, und während der Antwort, während er vom Server gesendete Daten liest, zu berücksichtigen.

Lesen: Dies ist die maximale Zeit, um eine HTTP-Anfrage zu empfangen Header vom Client.

3G/4G/56k/Satellit kann manchmal langsam sein. Dennoch sollten sie in wenigen Sekunden HTTP-Header senden können, NICHT 30.

Wenn jemand eine so schlechte Verbindung hat, dass es mehr als 30 Sekunden dauert, um eine Seite anzufordern (dann mehr als 10 * 30 Sekunden, um die 10 eingebetteten Bilder/CSS/JS anzufordern), halte ich es für akzeptabel, ihn abzulehnen.

timeout-Server:

Das Inaktivitätszeitlimit gilt, wenn vom Server erwartet wird, dass er Daten bestätigt oder sendet. Im HTTP-Modus ist dieses Zeitlimit besonders wichtig, um es in der ersten Phase der Serverantwort zu berücksichtigen, wenn die Header gesendet werden müssen, da es direkt die Verarbeitungszeit des Servers für die Anforderung darstellt. Um herauszufinden, welcher Wert dort platziert werden soll, ist es oft gut, mit den als nicht akzeptabel geltenden Antwortzeiten zu beginnen, dann die Protokolle zu überprüfen, um die Antwortzeitverteilung zu beobachten, und den Wert entsprechend anzupassen.

Lesen: Dies ist die maximale Zeit, um eine HTTP-Antwort zu erhalten Header vom Server (nachdem die vollständige Clientanforderung empfangen wurde). Grundsätzlich ist dies die Verarbeitungszeit von Ihren Servern, bevor die Antwort gesendet wird.

Wenn Ihr Server so langsam ist, dass er mehr als 30 Sekunden benötigt, um eine Antwort zu geben, ist es meiner Meinung nach akzeptabel, ihn als tot zu betrachten.

Sonderfall: Einige seltene Dienste, die eine sehr umfangreiche Verarbeitung ausführen, benötigen möglicherweise eine volle Minute oder länger, um eine Antwort zu geben. Dieses Zeitlimit muss für diese spezielle Verwendung möglicherweise erheblich erhöht werden. (Hinweis: Dies ist wahrscheinlich ein Fall von schlechtem Design, verwenden Sie eine asynchrone Kommunikation oder verwenden Sie überhaupt kein HTTP.)

timeout-Verbindung:

Legen Sie die maximale Wartezeit für einen erfolgreichen Verbindungsversuch zu einem Server fest.

Lesen: Die maximale Zeit, die ein Server benötigt, um eine TCP -Verbindung) zu akzeptieren.

Server befinden sich im selben LAN wie HAProxy, daher sollte es schnell sein. Geben Sie ihm mindestens 5 Sekunden Zeit, da es so lange dauern kann, bis etwas Unerwartetes passiert (ein verlorenes TCP Paket zur erneuten Übertragung, ein Server, der einen neuen Prozess zum Aufnehmen der neuen Anforderungen forciert, Anstieg des Datenverkehrs) .

Sonderfall: Wenn sich Server in einem anderen LAN oder über eine unzuverlässige Verbindung befinden. Dieses Zeitlimit muss möglicherweise stark erhöht werden. (Hinweis: Dies ist wahrscheinlich ein Fall von schlechter Architektur.)

timeout-Prüfung:

Stellen Sie ein zusätzliches Zeitlimit für die Prüfung ein, jedoch erst, nachdem bereits eine Verbindung hergestellt wurde.

Festlegen eines zusätzlichen Zeitlimits für die Überprüfung, jedoch erst, nachdem bereits eine Verbindung hergestellt wurde Wenn festgelegt, verwendet haproxy min ("Zeitüberschreitung verbinden", "inter") als Verbindungszeitlimit für die Prüfung und "Zeitüberschreitungsprüfung" als zusätzliches Lesezeitlimit. Das "min" wird verwendet, damit Personen mit sehr langer "Timeout-Verbindung" (z. B. diejenigen, die dies aufgrund der Warteschlange oder des Tarpits benötigen) dies tun ihre Schecks nicht verlangsamen. (Bitte beachten Sie auch, dass es keinen gültigen Grund für so lange Verbindungszeitüberschreitungen gibt, da "Zeitüberschreitungswarteschlange" und "Zeitüberschreitungs-Tarpit" immer verwendet werden können, um dies zu vermeiden.).

Lesen: Bei der Durchführung einer Integritätsprüfung verfügt der Server über timeout connect um die Verbindung zu akzeptieren dann timeout check um die Antwort zu geben.

Auf allen Servern MUSS eine HTTP (S) -Zustandsprüfung konfiguriert sein. Nur so kann der Load Balancer feststellen, ob ein Server verfügbar ist. Der Healthcheck ist ein einfaches /isalive Seite antwortet immer OK.

Geben Sie diesem Timeout mindestens 5 Sekunden, da es so lange dauern kann, bis etwas Unerwartetes passiert (ein verlorenes TCP Paket zum erneuten Senden, ein Server, der einen neuen Prozess zum Aufnehmen der neuen Anforderungen forciert, und ein Anstieg des Datenverkehrs) ).

War Story: Viele Leute zu Unrecht glauben, dass der Server diese einfache Seite immer in 3 ms beantworten kann. Sie setzen ein aggressives Timeout (<2000 ms) mit aggressivem Failover (2 fehlgeschlagene Prüfungen = Server tot). Ich habe ganze Websites gesehen, die deswegen ausfielen. In der Regel gibt es einen leichten Anstieg des Datenverkehrs, Backend-Server werden langsamer, die Integritätsprüfungen werden verzögert ... bis plötzlich alle Zeitüberschreitungen auftreten, glaubt HAProxy, dass ALLE Server auf einmal gestorben sind und die gesamte Site ausfällt.

35
user5994461