Według jakich kryteriów dostosowujesz limity czasu w konfiguracji HA Proxy?

37

Podczas konfigurowania serwera proxy HA, jak zdecydować, jakie wartości przypisać do limitów czasu? Przeczytałem pół tuzina próbek na różnych blogach i wszyscy używają różnych limitów czasu i nikt nie dyskutuje dlaczego.

HAProxy wydaje się szczególnie zaniepokojony klientem, połączeniem i serwerem, o którym HAPRoxy wyświetla ostrzeżenie, jeśli pozostawisz całkowicie nieuzbrojony:

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'.

Dokumentacja jest nieprzydatny w tym względzie: „sugeruje nieco powyżej wielokrotności 3 sekundy”, ale nie dlaczego chcesz wybrać wielokrotność 1 vs 100 lub 42.

RPM, którego używam (repozytorium Amazon Linux) ustawia następujące wartości domyślne:

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

Dwie z nich to dokładne wielokrotności 3 sekund, co stanowi naruszenie jedynej oficjalnej porady, jaką widziałem.

Jeśli nie masz szczegółowych porad dotyczących tuningu, być może łatwiejsze pytanie brzmi: czego mogę się spodziewać po bardzo krótkich lub naprawdę długich przerwach?

Jeremy Wadhams
źródło

Odpowiedzi:

40

TCP RTO (limit czasu odbioru) rozpoczyna się po trzech sekundach. ( RFC 1122 ) Jeśli do przesłanego pakietu nie zwrócono potwierdzenia w tym czasie, zakłada się, że został utracony i ponownie przesłany. Jest to prawie na pewno to, o czym mówi autor. (Należy pamiętać, że RTO jest dostrajany dynamicznie w górę lub w dół za pomocą różnych algorytmów , poza zakresem tego pytania.)

Należy pamiętać, że tak naprawdę dotyczy to tylko połączeń między serwerem frontonu a klientami (tj. Użytkownikami sieci). W normalnych scenariuszach połączenia między HAProxy a serwerami zaplecza powinny odbywać się w sieci LAN i powinieneś używać znacznie krótszych limitów czasu, aby szybciej działające backendy zostały wcześniej wyłączone z usługi.

Jeśli chodzi o twoich użytkowników sieci, niektórzy z nich mogą korzystać z połączeń o bardzo dużych opóźnieniach, takich jak satelita, i mogą z tego powodu występować retransmisje z większą niż normalną częstotliwością. RTT na połączeniu z satelitą może przekraczać 2000 ms, nawet jeśli wszystko jest w porządku.

Mając to na uwadze, na ogół będziesz potrzebować bardzo krótkich limitów czasu timeout connecti bardzo długich timeout client.

Na timeout serverto zależy od aplikacji internetowej. Podczas ustawiania limitu czasu należy wziąć pod uwagę złożoność obsługiwanej aplikacji internetowej oraz czas, w którym przetworzenie złożonego żądania może zająć w najgorszym przypadku. W razie wątpliwości podnieś wartość.

Michael Hampton
źródło
7
Naprawdę najbardziej erudycyjna i grzeczna odpowiedź, jaką otrzymałem na StackExchange. Dziękuję Ci.
Jeremy Wadhams
5
Co mogę powiedzieć, Server Fault to tylko garstka gburowatych curmudgeonów.
Michael Hampton
33

Przedmowa

Od jakiegoś czasu dostrajam HAProxy i przeprowadziłem na nim wiele testów wydajności. Od 100 żądań HTTP / s do 50 000 żądań HTTP / s.

Pierwszą radą jest włączenie strony statystyk w HAProxy . POTRZEBUJESZ monitorowania, bez wyjątku. Będziesz także potrzebował dostrajania, jeśli zamierzasz przekroczyć 10 000 żądań / s.

Limity czasu są mylącą bestią, ponieważ mają ogromny zakres możliwych wartości, z których większość nie ma zauważalnej różnicy. Nie widziałem jeszcze, żeby coś zawiodło z powodu o 5% mniejszej lub o 5% wyższej. 10000 vs 11000 milisekund, kogo to obchodzi? Prawdopodobnie nie twój system.

Konfiguracja

Nie mogę z czystym sumieniem podać kilku liczb jako „najlepszych limitów czasu dla wszystkich”.

Zamiast tego mogę powiedzieć, NAJBARDZIEJ agresywne limity czasu, które są zawsze dopuszczalne w przypadku równoważenia obciążenia HTTP (S). Jeśli napotkasz niższe wartości, nadszedł czas, aby ponownie skonfigurować moduł równoważenia obciążenia.

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

klient limitu czasu:

Limit czasu braku aktywności ma zastosowanie, gdy oczekuje się od klienta potwierdzenia lub wysłania danych. W trybie HTTP ten limit czasu jest szczególnie ważny do rozważenia podczas pierwszej fazy, kiedy klient wysyła żądanie oraz podczas odpowiedzi podczas odczytywania danych wysyłanych przez serwer.

Przeczytaj : Jest to maksymalny czas na otrzymanie nagłówków żądań HTTP od klienta.

Czasami 3G / 4G / 56k / satelita może być wolny. Nadal powinny być w stanie wysłać nagłówki HTTP w ciągu kilku sekund, NIE 30.

Jeśli ktoś ma tak złe połączenie, że potrzebuje więcej niż 30 sekund, aby poprosić o stronę (następnie więcej niż 10 * 30s, aby poprosić o 10 osadzonych obrazów / CSS / JS), uważam, że jest dopuszczalne, aby go odrzucić.

serwer limitu czasu:

Limit czasu bezczynności ma zastosowanie, gdy oczekuje się, że serwer potwierdzi lub wyśle ​​dane. W trybie HTTP ten limit czasu jest szczególnie ważny do rozważenia podczas pierwszej fazy odpowiedzi serwera, gdy musi on wysłać nagłówki, ponieważ bezpośrednio reprezentuje czas przetwarzania serwera dla żądania. Aby dowiedzieć się, jaką wartość tam umieścić, często dobrze jest zacząć od czasów, które byłyby uważane za niedopuszczalne czasy odpowiedzi, a następnie sprawdzić dzienniki, aby obserwować rozkład czasu odpowiedzi i odpowiednio dostosować wartość.

Odczyt : Jest to maksymalny czas na otrzymanie nagłówków odpowiedzi HTTP z serwera (po otrzymaniu pełnego żądania klienta). Zasadniczo jest to czas przetwarzania z serwerów, zanim zacznie wysyłać odpowiedź.

Jeśli twój serwer jest tak wolny, że potrzeba ponad 30 sekund, aby zacząć udzielać odpowiedzi, to uważam, że dopuszczalne jest uznanie go za martwy.

Przypadek szczególny : udzielenie odpowiedzi na niektóre usługi RZADKIE bardzo intensywne przetwarzanie może zająć minutę lub dłużej. Ten limit czasu może wymagać znacznego zwiększenia w przypadku tego konkretnego zastosowania. (Uwaga: może to być przypadek złego projektu, użyj komunikacji w stylu asynchronicznym lub w ogóle nie używaj HTTP).

limit czasu połączenia:

Ustaw maksymalny czas oczekiwania na próbę nawiązania połączenia z serwerem.

Przeczytaj : Maksymalny czas, w którym serwer musi zaakceptować połączenie TCP.

Serwery są w tej samej sieci LAN co HAProxy, więc powinno być szybkie. Daj mu co najmniej 5 sekund, ponieważ tyle czasu może potrwać, gdy wydarzy się coś nieoczekiwanego (utracony pakiet TCP do retransmisji, serwer wymyślający nowy proces do przyjmowania nowych żądań, wzrost ruchu).

Przypadek szczególny : gdy serwery są w innej sieci LAN lub łączą niewiarygodne. Ten limit czasu może wymagać znacznego zwiększenia. (Uwaga: może to być przypadek złej architektury).

kontrola limitu czasu:

Ustaw dodatkowy limit czasu sprawdzania, ale dopiero po nawiązaniu połączenia.

Ustaw dodatkowy limit czasu sprawdzania, ale dopiero po nawiązaniu połączenia Jeśli jest ustawiony, haproxy używa min („limit czasu połączenia”, „inter”) jako limit czasu połączenia dla sprawdzenia i „limit czasu sprawdzenia” jako dodatkowego limitu czasu odczytu. „Min” jest używane, aby osoby biegnące z bardzo długim „limitem czasu połączenia” (np. Ci, którzy tego potrzebowali z powodu kolejki lub tarpit), nie spowalniały kontroli. (Należy również pamiętać, że nie ma uzasadnionego powodu, aby mieć tak długie limity czasu połączenia, ponieważ „kolejki limitów” i „tarpit limitów czasu” można zawsze użyć, aby tego uniknąć).

Przeczytaj : Podczas przeprowadzania kontroli poprawności serwer musi timeout connectzaakceptować połączenie, a następnie timeout checkudzielić odpowiedzi.

Wszystkie serwery MUSZĄ mieć skonfigurowane sprawdzenie poprawności HTTP (S). To jedyny sposób, aby moduł równoważenia obciążenia wiedział, czy serwer jest dostępny. Kontrola zdrowia to prosta /isalivestrona, na którą zawsze można odpowiedzieć OK.

Daj temu limit czasu co najmniej 5 sekund, ponieważ tyle czasu może potrwać, gdy wydarzy się coś nieoczekiwanego (utracony pakiet TCP do ponownej transmisji, serwer wymusza nowy proces do przyjmowania nowych żądań, wzrost ruchu).

War Story : Wiele osób błędnie uważa, że ​​serwer zawsze może odpowiedzieć na tę prostą stronę w 3 ms. Ustawiają agresywny limit czasu (<2000 ms) z agresywnym przełączaniem awaryjnym (2 nieudane kontrole = serwer nie działa). Z tego powodu widziałem, jak całe witryny się psują. Zazwyczaj występuje niewielki wzrost ruchu, serwery zaplecza stają się wolniejsze, kontrole zdrowia są opóźnione ... aż nagle wszystkie się skończyły razem, HAProxy uważa, że ​​WSZYSTKIE serwery zginęły jednocześnie, a cała strona się zawiodła.

użytkownik5994461
źródło