Ich habe Gunicorn mit 3 Arbeitern, 30 Arbeiterverbindungen und Eventlet-Arbeiterklasse eingerichtet. Es ist hinter Nginx eingerichtet. Nach jeweils wenigen Anfragen sehe ich dies in den Protokollen.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Warum passiert dies? Wie kann ich herausfinden, was falsch läuft?
Vielen Dank
Gunicorn==19.3.1
undgevent==1.0.1
Antworten:
Wir hatten das gleiche Problem mit Django + Nginx + Gunicorn. Aus der Gunicorn-Dokumentation haben wir das Graceful-Timeout konfiguriert, das fast keinen Unterschied machte.
Nach einigen Tests haben wir die Lösung gefunden. Der zu konfigurierende Parameter lautet: Zeitüberschreitung (und keine ordnungsgemäße Zeitüberschreitung). Es funktioniert wie eine Uhr.
Dann mach's:
1) Öffnen Sie die Gunicorn-Konfigurationsdatei
2) Stellen Sie den TIMEOUT auf das ein, was Sie brauchen - der Wert ist in Sekunden angegeben
quelle
pip install gevent
dannworker_class gevent
in Ihrer Konfigurationsdatei oder-k gevent
in der Befehlszeile.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
In der Google Cloud
--timeout 90
Fügen Sie einfach den Einstiegspunkt in hinzuapp.yaml
quelle
Führen Sie Gunicorn mit
--log-level=DEBUG
.Es sollte Ihnen einen App-Stack-Trace geben.
quelle
--log-level debug
Könnte es das sein? http://docs.gunicorn.org/en/latest/settings.html#timeout
Andere Möglichkeiten könnten sein, dass Ihre Antwort zu lange dauert oder nicht weiter wartet.
quelle
Sie müssen eine andere Worker-Typ-Klasse verwenden, eine asynchrone wie gevent oder tornado. Weitere Erläuterungen finden Sie hier: Erste Erläuterung:
Das Zweite :
quelle
Ich hatte ein sehr ähnliches Problem. Ich habe auch versucht, mit "runserver" zu prüfen, ob ich etwas anderes als eine Nachricht finden konnte
Killed
Also dachte ich, es könnte ein Ressourcenproblem sein, und ich gab der Instanz mehr RAM, und es funktionierte.
quelle
WORKER TIMEOUT
bedeutet, dass Ihre Anwendung nicht innerhalb eines festgelegten Zeitraums auf die Anfrage antworten kann. Sie können dies mit Gunicorn Timeout-Einstellungen einstellen . Einige Anwendungen benötigen mehr Zeit für die Antwort als andere.Eine andere Sache, die dies beeinflussen kann, ist die Auswahl des Arbeitertyps
Als ich das gleiche Problem wie Sie hatte (ich habe versucht, meine Anwendung mit Docker Swarm bereitzustellen), habe ich versucht, das Zeitlimit zu erhöhen und einen anderen Typ von Worker-Klasse zu verwenden. Aber alles ist gescheitert.
Und dann wurde mir plötzlich klar, dass ich meine Ressourcen für den Dienst in meiner Erstellungsdatei zu niedrig begrenzte . Dies ist die Sache, die die Anwendung in meinem Fall verlangsamt hat
Ich empfehle Ihnen daher, zunächst zu überprüfen, was Ihre Bewerbung verlangsamt
quelle
Dauert dieser Endpunkt zu lange?
Möglicherweise verwenden Sie eine Flasche ohne assynchrone Unterstützung, sodass jede Anforderung den Anruf blockiert. Fügen Sie den
gevent
Worker hinzu, um asynchrone Unterstützung zu erstellen, ohne dies zu erschweren .Mit gevent erzeugt ein neuer Anruf einen neuen Thread und Ihre App kann weitere Anfragen empfangen
quelle
Ich habe das gleiche Problem in Docker.
In Docker halte ich geschultes
LightGBM
Modell +Flask
bediene Anfragen. Als HTTP-Server habe ich verwendetgunicorn 19.9.0
. Wenn ich meinen Code lokal auf meinem Mac-Laptop ausführte, funktionierte alles einwandfrei, aber als ich die App in Docker ausführte, froren meine POST-JSON-Anforderungen einige Zeit ein, und dergunicorn
Worker war mit[CRITICAL] WORKER TIMEOUT
Ausnahme fehlgeschlagen .Ich habe unzählige verschiedene Ansätze ausprobiert, aber der einzige, der mein Problem gelöst hat, war das Hinzufügen
worker_class=gthread
.Hier ist meine komplette Konfiguration:
quelle
Wenn Sie GCP verwenden, müssen Sie Worker pro Instanztyp festlegen.
Link zu den Best Practices von GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
quelle
Timeout ist ein Schlüsselparameter für dieses Problem.
es passt jedoch nicht zu mir.
Ich fand, dass es keinen Gunicorn Timeout-Fehler gibt, wenn ich Arbeiter = 1 setze.
Wenn ich meinen Code durchschaue , habe ich eine Socket-Verbindung (socket.send & socket.recv) in Server Init gefunden.
socket.recv blockiert meinen Code und deshalb tritt immer eine Zeitüberschreitung auf, wenn Arbeiter> 1 sind
Ich hoffe, den Leuten, die ein Problem mit mir haben, einige Ideen zu geben
quelle
Das hat bei mir funktioniert:
Wenn Sie
eventlet
hinzugefügt haben:Wenn Sie
gevent
hinzugefügt haben:quelle
Für mich bestand die Lösung darin
--timeout 90
, meinen Einstiegspunkt zu erweitern, aber es funktionierte nicht, da ich ZWEI Einstiegspunkte definiert hatte, einen in app.yaml und einen in meiner Docker-Datei. Ich habe den nicht verwendeten Einstiegspunkt gelöscht und--timeout 90
den anderen hinzugefügt .quelle