Nginx - jakie jest znaczenie definicji `burst`, jeśli istnieje opcja` nodelay`

14

W konfiguracji Nginx, gdy chcesz ograniczyć szybkość przetwarzania żądań za pomocą limit_req_zone/ limit_req instructions, tak naprawdę nie rozumiem użycia tej nodelayopcji.
W moim rozumieniu powoduje to zakończenie żądań powyżej określonej stawki bez ich opóźniania. Więc wydaje się to równoznaczne z burst=0. Dlatego nie rozumiem następującego przykładu:

limit_req zone=one burst=5 nodelay;

burstokreśla liczbę żądań, które mogą być opóźnione, więc jakie znaczenie ma określenie, burstczy istnieje nodelayopcja?

Nicolas
źródło

Odpowiedzi:

28

Uważam, że limit_reqdokumentacja jest wystarczająco przejrzysta.

burst jest udokumentowane w ten sposób:

Nadmierne żądania są opóźniane, dopóki ich liczba nie przekroczy maksymalnego rozmiaru serii [...]

nodelay jest udokumentowane w ten sposób:

Jeśli opóźnianie nadmiernych żądań w trakcie ograniczania żądań nie jest pożądane, należy zastosować parametr nodelay

Żądania są ograniczone do określonej stawki. Jeśli żądania przychodzą z większą prędkością, obsłużona zostanie nie więcej niż określona liczba żądań na jednostkę czasu . Następnie musisz zdecydować, co zrobić z tymi innymi żądaniami.

  • Domyślnie (nie burst, nie nodelay) żądania są odrzucane z błędem HTTP 503.
  • Za pomocą burstustawia się określoną liczbę żądań w kolejce oczekującej, ale nie przetwarza się ich szybciej niż zdefiniowane żądania na stawkę jednostkową czasu .
  • Za pomocą bursti nodelaykolejka nie będzie czekać, a sekwencje żądań zostaną natychmiast przetworzone .
Bernard Rosset
źródło
3
Dziękujemy za wyjaśnienie, dokumentacja nie jest dla mnie wystarczająco jasna.
Nicolas
1
Zredagowałem swoją odpowiedź, aby odzwierciedlić dokument, cytując ją. Każde słowo jest starannie ważone w dokumentacji nginx, aby było zwięzłe: właśnie to jest miłe w tym.
Bernard Rosset,
3
Jaka jest więc różnica między tym, limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;co pozwala na 6 żądań na sekundę, a limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;które na 6 żądań na sekundę?
Nicolas
2
Chcę tylko potwierdzić o odpowiedzi Bernarda. Jeśli to, co powiedział Bernard, było poprawne: Z serią i opóźnieniem, szybkość r / s trafienia na serwer będzie od czasu do czasu większa niż zdefiniowane żądania, prawda?
Jcyrss
2
@BernardRosset, czy mógłbyś wyjaśnić „kolejka nie będzie czekać” - co przez to rozumiesz?
Denis Gorbaczow
8

Komentarze do pierwotnej odpowiedzi wydają się błędne.

Nasuwa się pytanie, jaka jest różnica między, powiedzmy, szybkość = 6r / s seria = 0 a stawka = 1r / s seria = 5 węzłów

Odpowiedzi są świetne w wyjaśnianiu różnicy, kiedy opcja nodelay NIE jest obecna - w takim przypadku żądania ustawiają się w kolejce z serią i są 503 bez tej serii.

Oryginalna odpowiedź wydaje się natychmiastowa - przy nodelay żądania serii są przetwarzane natychmiast. I dlatego jedyną tego konsekwencją jest to, że NIE ma różnicy między określeniem serii + węzła, a jedynie określeniem wyższej granicy z busrt = 0.

Dlatego, aby w bardziej zwięzły sposób odpowiedzieć na pytanie PO: znaczenie rozerwania, gdy określono węzeł nodelay, jest takie samo, jak określenie większej szybkości bez rozerwania.

fsm
źródło
Dzięki, że wyjaśniłem ten punkt, który był faktycznie powodem mojego pytania.
Nicolas
To jest źle. Przeczytaj moją odpowiedź + komentarze jeszcze raz. Jeśli nadal go nie widzisz, zróbmy szkic: 6r / s dla obu konfiguracji podanych przez Nicolasa w komentarzu do mojej odpowiedzi. Pierwsza sekunda -> oba scenariusze będą służyć 6r, ale conf # 2 zapisze 5 w serii. Druga sekunda i dalej, wciąż to samo dla conf # 1 (wszystkie 6r podano), ale conf # 2 usunie 1 z wiadra serii zgodnie z zużyciem odpowiadającym limitowi szybkości, pozostawiając miejsce na 1r w kolejce. Pozostałe 5r są wyrzucane.
Bernard Rosset,
@BernardRosset: ale nodelayczy nie oznacza to, że te żądania są przetwarzane natychmiast zamiast w kolejce?
siride,
4

Z bursti nodelayokreślone Łatwiej jest zrozumieć taki mechanizm (w drugą stronę niż zwykle się to rozumie):

  1. Zezwalasz na maksimum burstżądań. Ze $binary_remote_addrto maksymalna liczba wniosków, które akceptują z danego adresu. Każde żądanie zwiększa licznik wewnętrzny. Kiedy licznik osiągnie, burstwszystkie dodatkowe żądania są odrzucane (a licznik nie jest zwiększany ponad burstwartość).
  2. Licznik ten jest stale zmniejszany w tempie określonym za pomocą rate.

Ta logika sugeruje, że sensowne jest określenie wysokiej burstwartości (np. 100 i więcej) i niskiej ratewartości (nawet czegoś takiego jak 2r / s). To lepiej obsługuje normalne przeglądanie (partia równoległych żądań, po których następuje cicha przerwa), jednocześnie chroniąc przed ciągłym strumieniem żądań bota.

Dan
źródło
1

Zadałem pytanie Nicolasa facetowi, który napisał poniższy post na stronie nginx. NGINX Ograniczenie prędkości. Odpowiedź jest jak poniżej

W poprzednim limicie prędkości nginx będzie akceptował kolejne żądania w odstępach 1/6 sekundy. nie zaakceptuje serii żądań, które nie spełniają tego minimalnego przedziału czasu. Z drugiej strony, w tej ostatniej definicji, nginx zaakceptuje serię maksymalnie 6 żądań, niezależnie od odstępu czasu między żądaniami. Link do odpowiedzi

Ogrodnik
źródło
Witaj @Gardener i witaj w przypadku błędu serwera. Dziękujemy za dobrze przygotowany wkład. Link do źródła jest bardzo mile widziane.
Marco,
0

W oparciu o doskonałą odpowiedź Dana i kod źródłowy nginx zwięzłe podsumowanie tego nodelayzachowania wydaje się następujące:

  • burstokreśla liczbę dozwolonych nowych równoczesnych żądań.
  • ratejest, jak wiele nowych jednoczesnych żądań stał stary na jednostkę czasu. (Aktualizacja odbywa się stopniowo: raz na żądanie, ale nie na sekundę).
Kirill Bulygin
źródło