Jak rozwiązać błąd przekroczenia limitu czasu krytycznego pracownika gunicorn?

26

Użyłem nginx i gunicorn do hostowania mojej witryny na dwóch serwerach,

Oba serwery mają te same wersje pakietów, a witryna jest pomyślnie hostowana,

Ale na jednym z moich serwerów gunicorn zawsze dostaje limit czasu i pojawia się błąd

[CRITICAL]Worker Timeout
Booting worker with pid
Worker cannot boot with pid

A potem pojawia się błąd 502 Badgateway na stronie. Muszę ponownie uruchomić proces gunicorn, aby wyświetlić stronę internetową.

Poniżej znajduje się dziennik błędów:

2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)
2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)   
2014-02-16 14:29:53 [22140] [INFO] Booting worker with pid: 22140

I dostaję taki błąd Continuos,

2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:57 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE

I pracownik zaczyna od nowa,

2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [22276] [INFO] Booting worker with pid: 22276

Znowu ignorowanie błędu EPIPE i trwa to do momentu ponownego uruchomienia gunicorn. A kiedy pojawia się ten błąd, otrzymuję błąd bramy 504 od nginx

sm
źródło
1
Czy możesz podać więcej informacji? Polecenie, którego używasz do uruchomienia Gunicorn, byłoby dobrym początkiem.
supervacuo
Śledź pracownika, aby zobaczyć, gdzie się zacina:strace -p <PID> -e trace=network -t
Aryeh Leib Taurog
Z jakiej aplikacji korzystasz? Możesz zwiększyć domyślny limit czasu.
Burhan Khalid
Tak Burhan Khalid, na razie zwiększyłem proxy_read_timeout do 1200 w nginx i limit czasu do 3600 w konfiguracji gunicorn. Mam nadzieję, że to
zadziała
@sm - czy to zadziałało?
iamkhush 16.04.16

Odpowiedzi:

29

Aby to naprawić, zwiększ limit czasu w Nginx,

W Nginx zwiększ proxy_connect_timeouti proxy_read_timeoutmożesz dodać następujące w pliku nginx.conf zgodnie z httpdyrektywą. Domyślnie mają 60 lat.

proxy_connect_timeout 300s;

proxy_read_timeout 300s;

Uruchom ponownie serwer Nginx. Zobacz dokumenty Nginx dotyczące limitów czasu .

Jeśli powyższa poprawka nie działa, zwiększ flagę limitu czasu Gunicorn w konfiguracji Gunicorn, domyślny limit czasu Gunicorn wynosi 30 sekund.

- limit czasu 90

Dokumentacja Gunicorn o przekroczeniu limitu czasu

-t INT, --timeout INT 30 Pracownicy milczący dłużej niż przez wiele sekund są zabijani i restartowani.

Ogólnie ustawiony na trzydzieści sekund. Ustaw tę wartość zauważalnie wyżej tylko wtedy, gdy masz pewność konsekwencji dla pracowników synchronizacji. W przypadku pracowników niezsynchronizowanych oznacza to po prostu, że proces roboczy nadal komunikuje się i nie jest związany z czasem wymaganym do obsłużenia pojedynczego żądania.

Dokumenty Gunicorn dotyczące limitów czasu pracy

Mam nadzieję, że to rozwiązuje problem.

sreekanth
źródło
2
To rozwiązanie uratowało mi życie po tym, jak szukałem rozwiązania przez cały dzień. Jeśli naprawdę masz proces trwający dłużej niż 30 sekund (co było moim problemem), jest to zdecydowanie właściwe rozwiązanie.
Alex P. Miller
Tak, nawet my mamy scenariusz, który działa dłużej niż 30 sekund, dlatego przyjęliśmy rozwiązanie. Fajnie, że pomogło.
sreekanth
Nie mamy takiego scenariusza. Na miejscu jest niewielki ruch, ale pracownicy przekraczają limit czasu każdego dnia prawie o tej samej porze. Następnie biegnie po 1-2 minutach. Moja konfiguracja to nginx - supervisor - gunicorn - django. Mam limit czasu 120 sekund.
iamkhush,
proxy_connect_timeout: "Definiuje limit czasu na ustanowienie połączenia z serwerem proxy. Należy zauważyć, że limit ten zwykle nie może przekraczać 75 sekund ."
deweydb,
@iamkhush, czy udało Ci się znaleźć rozwiązanie tego problemu? Mam również do czynienia z tym problemem, nawet gdy moja aplikacja jest bezczynna. Pracownicy Gunicorn mają limit czasu każdego dnia i żadne z rozwiązań, takich jak zwiększenie limitu czasu, nie wydaje się działać.
Ankit Jaiswal