Nginx - Was bedeutet die Definition von "Burst", wenn die Option "Nodelay" verfügbar ist?


14

Wenn Sie in der Nginx-Konfiguration die Anforderungsverarbeitungsrate mithilfe von limit_req_zone/ begrenzen möchten, limit_req instructionsverstehe ich die Verwendung der nodelayOption nicht wirklich .
Meines Erachtens werden die Anforderungen über der festgelegten Rate beendet, ohne sie zu verzögern. Es scheint also äquivalent zu burst=0. Deshalb verstehe ich folgendes Beispiel nicht:

limit_req zone=one burst=5 nodelay;

burstDefiniert die Anzahl der Anfragen, die verzögert werden könnten. Welche Bedeutung muss definiert werden, burstwenn die nodelayOption verfügbar ist ?

Antworten:


28

Ich finde die limit_reqDokumentation klar genug.

burst ist so dokumentiert:

Übermäßige Anforderungen werden verzögert, bis ihre Anzahl die maximale Burst-Größe [...] überschreitet.

nodelay ist so dokumentiert:

Wenn eine Verzögerung übermäßiger Anforderungen während der Begrenzung von Anforderungen nicht gewünscht ist, sollte der Parameter nodelay verwendet werden

Anfragen sind auf den definierten Tarif begrenzt. Wenn Anfragen mit einer höheren Rate eingehen, wird nicht mehr als die festgelegte Anzahl von Anfragen pro Zeiteinheit bearbeitet. Sie müssen dann entscheiden, was mit diesen anderen Anforderungen geschehen soll.

  • Standardmäßig (nein burst, nein nodelay) werden Anforderungen mit einem HTTP 503-Fehler abgelehnt.
  • Mit burst, können Sie die definierte Anzahl von Anfragen in einer Warteschlange stapeln, aber Sie verarbeiten sie nicht schneller als die definierten Anforderungen pro Zeiteinheit Rate .
  • Mit burstund nodelaywartet die Warteschlange nicht und Anforderungsbursts werden sofort verarbeitet .

3
Vielen Dank für Ihre Klarstellung, die Dokumentation ist mir nicht klar genug.
Nicolas

1
Ich habe meine Antwort so bearbeitet, dass sie der Dokumentation entspricht, indem ich sie zitiere. Jedes Wort wird in der Nginx-Dokumentation sorgfältig gewichtet, um es kurz zu halten: Das ist das Schöne daran.
Bernard Rosset

3
Worin besteht also der Unterschied zwischen limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;6 Anforderungen pro Sekunde und limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;6 Anforderungen pro Sekunde?
Nicolas

2
Ich möchte nur Bernards Antwort bestätigen. Wenn das, was Bernard gesagt hat, richtig ist, mit Burst und Nodelay, wird die Rate der Treffer auf dem Webserver von Zeit zu Zeit höher sein als die definierten Anforderungen, oder?
Jcyrss

2
@BernardRosset könntest du bitte klarstellen, dass die "Warteschlange nicht wartet" - was meinst du damit?
Denis Gorbatschow

8

Die Kommentare zur ursprünglichen Antwort scheinen falsch zu sein.

Die Frage ist, wie groß der Unterschied zwischen der Rate = 6r / s Burst = 0 und der Rate = 1r / s Burst = 5 Knoten ist

Die Antworten sind großartig, wenn es darum geht, den Unterschied zu erklären, wenn die Knotenverzögerungsoption NICHT vorhanden ist. In diesem Fall stehen die Anforderungen mit dem Burst in der Warteschlange und werden ohne den Burst 503-mal ausgeführt.

Die ursprüngliche Antwort scheint genau richtig - mit nodelay werden die Burst-Anforderungen sofort verarbeitet. Die einzige Konsequenz daraus ist, dass es KEINEN Unterschied zwischen der Angabe eines Burst + Nodelay und der Angabe eines höheren Limits mit busrt = 0 gibt.

Um die OP-Frage genauer zu beantworten: Die Bedeutung von Burst bei Angabe von Nodelay entspricht der Angabe einer größeren Rate ohne Burst.


Vielen Dank, dass Sie diesen Punkt geklärt haben, der effektiv der Grund für meine Frage war.
Nicolas

Das ist falsch. Lesen Sie meine Antwort + Kommentare noch einmal. Wenn Sie es immer noch nicht sehen, lassen Sie uns skizzieren: 6r / s für beide Konfigurationen, die von Nicolas in einem Kommentar zu meiner Antwort bereitgestellt wurden. 1. Sekunde -> beide Szenarien liefern 6r, aber Konf # 2 speichert 5 im Burst. 2. Sekunde und danach, immer noch das Gleiche für Conf # 1 (alle 6 R serviert), aber Conf # 2 hat 1 aus dem Burst-Bucket entfernt, je nach Verbrauch, der dem Ratenlimit entspricht, und lässt Platz für 1 R in der Warteschlange. Die anderen 5r werden weggeworfen.
Bernard Rosset

@BernardRosset: Aber mit nodelay, heißt das nicht, dass diese Anfragen sofort bearbeitet werden und nicht in die Warteschlange gestellt werden?
Siride

4

Mit burstund nodelayangegeben finde ich es einfacher, den Mechanismus so zu verstehen (anders herum als es normalerweise verstanden wird):

  1. Sie erlauben maximal burstAnfragen. Dies $binary_remote_addrist die maximale Anzahl von Anfragen, die Sie von einer bestimmten Adresse aus annehmen. Jede Anfrage erhöht einen internen Zähler. Wenn der Zähler erreicht ist, werden burstalle zusätzlichen Anforderungen abgelehnt (und der Zähler wird nicht über den burstWert hinaus erhöht ).
  2. Dieser Zähler wird kontinuierlich mit einer unter Verwendung von festgelegten Rate verringert rate.

Diese Logik legt nahe, dass es durchaus sinnvoll ist, einen hohen burstWert (z. B. 100 und mehr) und einen niedrigen rateWert (sogar etwas wie 2r / s) anzugeben . Dadurch wird das normale Browsen (eine Reihe paralleler Anforderungen, gefolgt von einer Ruhephase) besser verarbeitet und gleichzeitig der Schutz vor anhaltendem Bot-Anforderungsstrom verbessert.


1

Ich habe Nicolas 'Frage an den Mann gestellt, der den folgenden Beitrag auf der Nginx-Website geschrieben hat. NGINX Ratenbegrenzung. Seine Antwort ist wie folgt

Bei der vorherigen Ratenbeschränkung akzeptiert nginx aufeinanderfolgende Anforderungen im Abstand von 1/6 Sekunde. Es werden keine Anforderungsbündel akzeptiert, die dieses Mindestzeitintervall nicht erfüllen. Andererseits akzeptiert Nginx in der letzteren Definition einen Burst von bis zu 6 Anforderungen, unabhängig vom Zeitintervall zwischen den Anforderungen. Link beantworten


Hallo @Gardener und willkommen bei Server Fault. Vielen Dank für Ihren gelungenen Beitrag. Der Link zur Quelle wird sehr geschätzt.
Marco

0

Basierend auf der ausgezeichneten Antwort von Dan und dem Quellcode von nginxnodelay scheint eine kurze Zusammenfassung des Verhaltens wie folgt zu sein:

  • burstgibt an, wie viele neue gleichzeitige Anforderungen zulässig sind.
  • rategibt an, wie viele neue gleichzeitige Anforderungen pro Zeiteinheit alt werden. (Diese Aktualisierung erfolgt schrittweise: einmal pro Anforderung, jedoch nicht pro Sekunde.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.