Mieliśmy dzisiaj mały problem z przełączaniem awaryjnym z jedną z naszych maszyn wirtualnych HAProxy. Kiedy wkopaliśmy się w to, znaleźliśmy to:
26 stycznia 07:41:45 jądro haproxy2: [226818.070059] __ratelimit: 10 połączeń zwrotnych pomijanych 26 stycznia 07:41:45 jądro haproxy2: [226818.070064] Brak pamięci gniazda 26 stycznia 07:41:47 jądro haproxy2: [226819.560048] Brak pamięci gniazda 26 stycznia 07:41:49 jądro haproxy2: [226822.030044] Brak pamięci gniazda
Co, według tego linku , najwyraźniej ma to związek z niskimi ustawieniami domyślnymi dla net.ipv4.tcp_mem
. Więc zwiększyliśmy je o 4x od wartości domyślnych (jest to Ubuntu Server, nie jestem pewien, czy smak Linuksa ma znaczenie):
obecne wartości to: 45984 61312 91968 nowe wartości to: 183936 245248 367872
Następnie zaczęliśmy widzieć dziwny komunikat o błędzie:
26 stycznia 08:18:49 jądro haproxy1: [2291.579726] Łańcuch skrótu trasy jest za długi! 26 stycznia 08:18:49 jądro haproxy1: [2291.579732] Dostosuj swój tajny_interwał!
Ciii… to tajemnica !!
Najwyraźniej ma to związek z /proc/sys/net/ipv4/route/secret_interval
domyślną wartością 600 i kontroluje okresowe opróżnianie pamięci podręcznej trasy
secret_interval
Instruuje jądro, jak często się zdmuchnąć wszystkie wpisy hash trasa niezależnie od tego jak nowe / stare są. W naszym środowisku jest to ogólnie złe. Procesor będzie zajęty odbudowaniem tysięcy wpisów na sekundę za każdym razem, gdy pamięć podręczna zostanie wyczyszczona. Jednak uruchamiamy to raz dziennie, aby nie dopuścić do wycieków pamięci (choć nigdy nie mieliśmy).
Chociaż z przyjemnością to zmniejszamy, wydaje się dziwne zalecanie upuszczania całej pamięci podręcznej trasy w regularnych odstępach czasu , zamiast po prostu szybszego wypychania starych wartości z pamięci podręcznej trasy.
Po pewnym dochodzeniu znaleźliśmy, /proc/sys/net/ipv4/route/gc_elasticity
która wydaje się lepszą opcją dla utrzymania rozmiaru tablicy tras:
gc_elasticity
najlepiej można opisać jako średnią głębokość wiadra, którą jądro zaakceptuje, zanim zacznie wygasać wpisy skrótu trasy. Pomoże to utrzymać górną granicę aktywnych tras.
Dostosowaliśmy elastyczność z 8 do 4, w nadziei, że pamięć podręczna trasy przycinała się bardziej agresywnie. secret_interval
Nie czuje poprawne do nas. Ale istnieje wiele ustawień i nie jest jasne, które są naprawdę właściwą drogą, aby przejść tutaj.
- / proc / sys / net / ipv4 / route / gc_elasticity (8)
- / proc / sys / net / ipv4 / route / gc_interval (60)
- / proc / sys / net / ipv4 / route / gc_min_interval (0)
- / proc / sys / net / ipv4 / route / gc_timeout (300)
- / proc / sys / net / ipv4 / route / secret_interval (600)
- / proc / sys / net / ipv4 / route / gc_thresh (?)
- rhash_entries (parametr jądra, domyślnie nieznany?)
Nie chcemy pogarszać routingu Linuksa , więc obawiamy się, że zepsujemy niektóre z tych ustawień.
Czy ktoś może doradzić, które parametry routingu najlepiej dostosować do wystąpienia HAProxy o dużym natężeniu ruchu?
/proc/sys/net/ipv4/tcp_max_orphans
wystąpi inny błąd. Na przykład cały stos stosu wymiany ma/proc/sys/net/ipv4/tcp_max_orphans
65536 i/proc/net/sockstat
powoduje TCP: inuse 2996 sierota 171 tw 15972 przydzieli 2998 mem 1621 - różnicy, której nie można zignorować.Regularnie dostosowujemy niektóre z tych parametrów. Nasz standard dla platform transakcyjnych o wysokiej przepustowości i niskim opóźnieniu to:
źródło