Skonfigurowałem gunicorn z 3 pracownikami 30 połączeniami pracowników i używam klasy robotników z eventlet. Jest skonfigurowany za Nginx. Po każdych kilku żądaniach widzę to w dziennikach.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Dlaczego to się dzieje? Jak mogę dowiedzieć się, co się dzieje?
dzięki
Gunicorn==19.3.1
igevent==1.0.1
Odpowiedzi:
Mieliśmy ten sam problem, używając Django + nginx + gunicorn. Z dokumentacji Gunicorn skonfigurowaliśmy bezpieczny limit czasu, który prawie nie robił różnicy.
Po kilku testach znaleźliśmy rozwiązanie, parametr do skonfigurowania to: timeout (a nie wdzięczny limit czasu). Działa jak zegar.
Więc zrób:
1) otwórz plik konfiguracyjny gunicorn
2) ustaw TIMEOUT na to, czego potrzebujesz - wartość jest w sekundach
źródło
pip install gevent
następnieworker_class gevent
w pliku konfiguracyjnym lub-k gevent
w wierszu poleceń.command=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application
W Google Cloud Po prostu dodaj
--timeout 90
do punktu wejścia wapp.yaml
źródło
Uruchom Gunicorn z
--log-level=DEBUG
.Powinien dać ci ślad stosu aplikacji.
źródło
--log-level debug
Czy to możliwe? http://docs.gunicorn.org/en/latest/settings.html#timeout
Inną możliwością może być to, że Twoja odpowiedź trwa zbyt długo lub utknęła w oczekiwaniu.
źródło
Musisz użyć innej klasy typu pracownika, asynchronicznej, takiej jak gevent lub tornado. Zobacz to, aby uzyskać więcej wyjaśnień: Pierwsze wyjaśnienie:
Drugi :
źródło
Miałem bardzo podobny problem, próbowałem też użyć „runerver”, aby sprawdzić, czy mogę cokolwiek znaleźć, ale jedyne co miałem to wiadomość
Killed
Pomyślałem więc, że może to być problem z zasobami i postanowiłem dać instancji więcej pamięci RAM i zadziałało.
źródło
WORKER TIMEOUT
oznacza, że aplikacja nie może odpowiedzieć na żądanie w określonym czasie. Możesz to ustawić za pomocą ustawień limitu czasu Gunicorn . Niektóre aplikacje potrzebują więcej czasu na odpowiedź niż inne.Inną rzeczą, która może mieć na to wpływ, jest wybór typu pracownika
Kiedy napotkałem ten sam problem co twój (próbowałem wdrożyć moją aplikację przy użyciu Docker Swarm), próbowałem zwiększyć limit czasu i użyć innego typu klasy roboczej. Ale wszystko zawiodło.
A potem nagle zdałem sobie sprawę, że ograniczam zasoby zbyt niskie dla usługi w moim pliku tworzenia. To właśnie spowolniło aplikację w moim przypadku
Proponuję więc najpierw sprawdzić, co spowalnia Twoją aplikację
źródło
Czy ten punkt końcowy zajmuje zbyt dużo czasu?
Może używasz flask bez wsparcia asynchronicznego, więc każde żądanie będzie blokować połączenie. Aby utworzyć obsługę asynchroniczną bez utrudniania, dodaj
gevent
pracownika.Dzięki gevent nowe połączenie spowoduje pojawienie się nowego wątku, a Twoja aplikacja będzie mogła otrzymywać więcej żądań
źródło
Mam ten sam problem w Dockerze.
W Dockerze utrzymuję wytrenowany
LightGBM
model +Flask
obsługę żądań. Jako serwer HTTP użyłemgunicorn 19.9.0
. Kiedy uruchamiam kod lokalnie na moim laptopie Mac, wszystko działało idealnie, ale kiedy uruchomiłem aplikację w Dockerze, moje żądania POST JSON zawieszały się przez jakiś czas, a następniegunicorn
pracownik nie działał z[CRITICAL] WORKER TIMEOUT
wyjątkiem.Wypróbowałem mnóstwo różnych podejść, ale jedynym rozwiązaniem mojego problemu było dodanie
worker_class=gthread
.Oto moja pełna konfiguracja:
źródło
Jeśli używasz GCP, musisz ustawić procesy robocze dla typu instancji.
Link do sprawdzonych metod GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
źródło
Limit czasu jest kluczowym parametrem tego problemu.
jednak nie jest to dla mnie odpowiednie.
stwierdziłem, że nie ma błędu przekroczenia limitu czasu Gunicorn, gdy ustawiam workers = 1.
kiedy patrzę na mój kod, znalazłem połączenie gniazda (socket.send i socket.recv) w inicjalizacji serwera.
socket.recv zablokuje mój kod i dlatego zawsze przekroczy limit czasu, gdy workery> 1
Mam nadzieję, że przekażę kilka pomysłów osobom, które mają ze mną jakiś problem
źródło
To zadziałało dla mnie:
Jeśli
eventlet
dodałeś:Jeśli
gevent
dodałeś:źródło
Dla mnie rozwiązaniem było dodanie
--timeout 90
do mojego punktu wejścia, ale nie działało, ponieważ miałem zdefiniowane DWA punkty wejścia, jeden w app.yaml, a drugi w moim pliku Dockerfile. Usunąłem nieużywany punkt wejścia i dodałem--timeout 90
w drugim.źródło