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?

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 .

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.


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.


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


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ę).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.