2012-06-01 6 views
93

Ich habe Gunicorn mit 3 Arbeitern 30 Worker-Verbindungen eingerichtet und die Eventlet-Worker-Klasse verwendet. Es ist hinter Nginx eingerichtet. Nach ein paar Anfragen sehe ich das in den Logs.Gunicorn worker timeout error

[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475) 
None 
[INFO] gunicorn.error: Booting worker with pid: 23514 

Warum passiert das? Wie kann ich herausfinden, was schief läuft?

dank

+1

Sie konnten Einsprungs das Problem lösen? Bitte teilen Sie Ihre Gedanken, wie ich auch dabei geblieben bin. 'Gunicorn == 19.3.1' und' gevent == 1.0.1' –

+1

Die Lösung gefunden. Zeitüberschreitung auf sehr großen Wert erhöht und dann konnte ich Stack-Trace –

Antwort

10

Run Gunicorn mit --log-level=DEBUG.

Es sollte Ihnen eine App-Stack-Trace geben.

+36

sehen. In meinem Fall nicht. – Joe

+7

es ist jetzt '--log-level debug ' – psychok7

+1

Ich würde gerne eine stracktrace bekommen, aber keiner von ihnen funktioniert hier, mit Gunicorn 19.4.5. Debug-Zeug wird angezeigt, also ich denke, das Flag wurde erkannt, aber StackTrace bei Timeout nicht. – orzel

5

Sie benötigen eine andere Arbeiter Typklasse eines asynchronen ein wie GEVENT oder Tornado verwenden dies für weitere Erläuterungen siehe: Erste explantion:

Sie auch installieren Eventlet oder GEVENT wollen, wenn Sie erwarten, dass Ihr Anwendungscode muss möglicherweise für längere Zeit während der Anforderungsverarbeitung

zweite pausieren:

Die standardmäßigen synchronen Worker setzen voraus, dass Ihre Anwendung hinsichtlich der CPU- und Netzwerkbandbreite ressourcengebunden ist. Im Allgemeinen bedeutet dies, dass Ihre Anwendung nichts tun sollte, was eine unbestimmte Zeit in Anspruch nimmt. Zum Beispiel erfüllt eine Anfrage an das Internet diese Kriterien. Irgendwann wird das externe Netzwerk so ausfallen, dass sich Clients auf Ihren Servern stapeln.

75

Wir hatten das gleiche Problem mit Django + Nginx + Gunicorn. Aus der Dokumentation von Gunicorn haben wir das Graceful-Timeout konfiguriert, das fast keinen Unterschied machte.

Nach einigen Tests fanden wir die Lösung, der Parameter zu konfigurieren ist: Timeout (Und nicht anmutige Timeout). Es funktioniert wie eine Uhr ..

So, Do:

1) Öffnen Sie die Konfigurationsdatei gunicorn

2), um die TIMEOUT gesetzt, was auch immer Sie brauchen - der Wert ist in Sekunden

NUM_WORKERS=3 
TIMEOUT=120 

exec gunicorn ${DJANGO_WSGI_MODULE}:application \ 
--name $NAME \ 
--workers $NUM_WORKERS \ 
--timeout $TIMEOUT \ 
--log-level=debug \ 
--bind=127.0.0.1:9000 \ 
--pid=$PIDFILE 
+5

Danke, das ist die richtige Antwort. Und um Ressourcen mit vielen gleichzeitigen Verbindungen zu sparen: 'pip install gevent' , dann' worker_class gevent' in der Konfigurationsdatei oder '-k gevent' in der Befehlszeile. –

+1

mit Gevent löst mein Problem. – LiberiFatali

3

ich sehr ähnliches Problem hatte, versuchte ich auch mit „runserver“, um zu sehen, ob ich etwas finden konnte, aber alles, was ich war ich t Killed

So eine Nachricht hatte Ich dachte, es könnte ein Ressourcenproblem sein, und ich ging weiter, um der Instanz mehr RAM zur Verfügung zu stellen, und es funktionierte.

+0

Ich sah dieses Problem mit sogar mit gevent und das Timeout richtig eingestellt, nicht genügend Arbeitsspeicher war das Problem – bcattle

2

Auf Google Cloud Gerade --timeout 90 hinzufügen in app.yaml

entrypoint: gunicorn -b :$PORT main:app --timeout 90