Korzystam z pgBouncer przed zajętą bazą danych postgres 9. Przez większość czasu działa dobrze. Ale co kilka godzin będę otrzymywać wiadomość e-mail o błędzie z mojej aplikacji z wyjątkiem psycopg2:
OperationalError („nie można połączyć się z serwerem: nie można przypisać żądanego adresu Czy serwer działa na hoście„ neo-hulk ”i akceptuje połączenia TCP / IP na porcie 6432?”)
Jest to aplikacja python z grupą pracowników selera wykonujących zadania. Po pojawieniu się tych błędów sprawdzam db pgbouncera i rozmiar puli mieści się w granicach. Po kilku eksperymentach ustawiłem maksymalny rozmiar puli na 400, a rozmiar puli na 200. Trybem puli jest „sesja” (żądania są w większości automatyczne zatwierdzania, prawie żadnych transakcji).
Co sprawia, że pgBouncer „znika” w ten sposób? jest to tylko przez krótki okres czasu (w sumie mówimy o niewielkiej liczbie żądań w porównaniu do samej liczby wniosków, które są przekazywane), ale te, które się nie powiedzie, są ważne.
Dzięki!
źródło
-vvv
i sprawdzić, czy możesz dopasować anomalne wyniki dziennika do swoich błędów w czasie.Odpowiedzi:
Część „ Nie można przypisać żądanego adresu ” w komunikacie o błędzie pochodzi ze stosu TCP jądra. W przypadku napotkania sporadycznie oznacza to zazwyczaj, że przestrzeń dostępnych gniazd jest wyczerpana z powodu zbyt dużej liczby gniazd w stanie oczekiwania (
TIME_WAIT
lub mniej prawdopodobneFIN_WAIT_1
lubFIN_WAIT_2
)Zakres portów gniazd może być wyprowadzany przez
cat /proc/sys/net/ipv4/ip_local_port_range
. Domyślna wartość standardowego jądra Linuksa to ogólnie32768 61000
.Możesz sprawdzić wynik
netstat -ton|grep WAIT
na kliencie (-ach) i na hoście pgBouncerera, gdy system jest zajęty.-o
Flag pokaże liczniki czasu oczekiwania związane z państw czekać.Jeśli łączna liczba gniazd TCP jest bliska,
61000-32768=28232
prawdopodobnie wyczerpanie tego zakresu jest prawdopodobnie problemem. Ponieważ zamknięte gniazdo spędza 60 sekund wTIME_WAIT
stanie w normalnym stanie, jeśli host klienta łączy się więcej niż 28232 razy w ciągu jednej minuty, nowe połączenia zakończą się niepowodzeniem z wymienionym błędem, dopóki porty nie zostaną zwolnione.Jako pierwsze obejście można rozszerzyć zakres portów TCP:
Jeśli nie jest zadowalający, sprawdź flagi
tcp_tw_recycle
itcp_tw_reuse
, a także przestrajaj przez/proc/sys/net/ipv4
isysctl
.Są one zdefiniowane jako (z
man tcp
):Osobiście odnosiłem sukces,
tcp_tw_recycle
gdy miałem do czynienia z tym problemem z aplikacją kliencką MySQL, ale nie bierz tego za zalecenie, moje rozumienie TCP jest w najlepszym razie powierzchowne.źródło
/etc/sysctl.conf
tak,net.ipv4.ip_local_port_range = 1025 65535
aby zachowało się po ponownym uruchomieniu.