Gunicorn: OSError: [Errno 11] Ressource vorübergehend nicht verfügbar in Version 19.8.1 (und 19.8.0) auf Heroku

Erstellt am 29. Mai 2018  ·  14Kommentare  ·  Quelle: benoitc/gunicorn

Ich betreibe einen einfachen Flask-Server auf Heroku:

web: gunicorn --worker-class eventlet -w 1 app:app --log-file=-

Es verwendet Python 2.7.15 für die Kompatibilität mit verschiedenen anderen Paketen.

Ich scheine vor Ewigkeiten auf ein Duplikat dieses Problems gestoßen zu sein, seit Heroku auf v. 19.8.1 umgezogen ist. Einige Bilder (mit einer Größe zwischen einigen KB und einigen MB) werden nicht geladen; Ich habe eine Website mit vielen Bildern (hauptsächlich Sprite-Sheets für Animationen) und scheinbar wird eine zufällige Auswahl von ihnen nicht jedes Mal geladen, wobei jedes Mal den folgenden Fehler auslöst (wenn die Bilder von einer früheren Version zwischengespeichert werden, wird sie ohne Probleme geladen) :

2018-05-29T09:24:36.216949+00:00 app[web.1]: [2018-05-29 09:24:36 +0000] [10] [ERROR] Socket error processing request. 2018-05-29T09:24:36.216969+00:00 app[web.1]: Traceback (most recent call last): 2018-05-29T09:24:36.216971+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 66, in handle 2018-05-29T09:24:36.216972+00:00 app[web.1]: six.reraise(*sys.exc_info()) 2018-05-29T09:24:36.216974+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 56, in handle 2018-05-29T09:24:36.216976+00:00 app[web.1]: self.handle_request(listener_name, req, client, addr) 2018-05-29T09:24:36.216978+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 129, in handle_request 2018-05-29T09:24:36.216980+00:00 app[web.1]: six.reraise(*sys.exc_info()) 2018-05-29T09:24:36.216981+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/async.py", line 112, in handle_request 2018-05-29T09:24:36.216983+00:00 app[web.1]: resp.write_file(respiter) 2018-05-29T09:24:36.216985+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 403, in write_file 2018-05-29T09:24:36.216987+00:00 app[web.1]: if not self.sendfile(respiter): 2018-05-29T09:24:36.216989+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 393, in sendfile 2018-05-29T09:24:36.216990+00:00 app[web.1]: sent += sendfile(sockno, fileno, offset + sent, count) 2018-05-29T09:24:36.216992+00:00 app[web.1]: File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/_sendfile.py", line 66, in sendfile 2018-05-29T09:24:36.216994+00:00 app[web.1]: raise OSError(e, os.strerror(e)) 2018-05-29T09:24:36.216996+00:00 app[web.1]: OSError: [Errno 11] Resource temporarily unavailable

dies sind die anderen Versionen in der requirements.txt:

Flask==0.12.2 gunicorn==19.8.1 pymongo==3.6.1 flask_socketio==2.9.6 flask_cors==3.0.3 eventlet==0.22.1 gevent==1.2.2

Das Ändern von Gunicorn auf 19.7.1 scheint das Problem zu lösen; es bleibt bei 19.8.0 bestehen.
Wie bei dem ähnlichen Problem von 2012 handelt es sich nicht um ein Zeitüberschreitungsproblem für Anforderungen, da der Fehler, den es auslöst, ziemlich unmittelbar ist. Das Zurücksetzen auf 19.7.1 hat es behoben, also bleibe ich vorerst dabei, aber es wäre schön, die neueste Version zu verwenden. Scheint ein Heroku-spezifisches Problem zu sein; Ich habe es erst im letzten Monat oder so bemerkt, kann aber keine Informationen darüber finden, wann sie die Versionen geändert haben.

Hilfreichster Kommentar

Ich habe heute den ganzen Tag mit dem gleichen Problem gekämpft. Und ich _denke_, ich habe es endlich behoben. Ich verwende Nginx, Flask, Gunicorn mit Eventlet und Docker.

Meine (relevante) pip freeze Ausgabe:

eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0

Mein Gunicorn-Befehl:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

Das erste Symptom waren große statische Dateiladevorgänge, die ERR_CONTENT_LENGTH_MISMATCH im Browser auslösten. Offensichtlich hat dies die Anwendung beschädigt, da große statische JS-Bibliotheken nicht geladen wurden.

Das zweite Symptom war, dass nginx Folgendes in error.log protokollierte: upstream prematurely closed connection while reading upstream

Schließlich habe ich es auf ein Gunicorn-Protokollelement zurückgeführt:

Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
    resp.write_file(respiter)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
    raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable

Meine letztendliche Lösung bestand darin, Gunicorn mit dem --no-sendfile -Flag zu starten, und das Problem verschwand. Warum? Ich bin mir nicht sicher ... Ich bin nur froh, dass es funktioniert.

Erwähnenswert ist auch, dass ich während meiner Fehlerbehebung mein Bestes getan habe, damit meine nginx.conf dem hier zu findenden Beispiel ähnelt: http://docs.gunicorn.org/en/stable/deploy.html

Alle 14 Kommentare

Ich habe heute den ganzen Tag mit dem gleichen Problem gekämpft. Und ich _denke_, ich habe es endlich behoben. Ich verwende Nginx, Flask, Gunicorn mit Eventlet und Docker.

Meine (relevante) pip freeze Ausgabe:

eventlet==0.23.0
Flask==1.0.2
greenlet==0.4.14
gunicorn==19.9.0

Mein Gunicorn-Befehl:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

Das erste Symptom waren große statische Dateiladevorgänge, die ERR_CONTENT_LENGTH_MISMATCH im Browser auslösten. Offensichtlich hat dies die Anwendung beschädigt, da große statische JS-Bibliotheken nicht geladen wurden.

Das zweite Symptom war, dass nginx Folgendes in error.log protokollierte: upstream prematurely closed connection while reading upstream

Schließlich habe ich es auf ein Gunicorn-Protokollelement zurückgeführt:

Socket error processing request. - [in /usr/local/lib/python2.7/dist-packages/gunicorn/glogging.py:277]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 66, in handle
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 56, in handle
    self.handle_request(listener_name, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 129, in handle_request
    six.reraise(*sys.exc_info())
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base_async.py", line 112, in handle_request
    resp.write_file(respiter)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 403, in write_file
    if not self.sendfile(respiter):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/wsgi.py", line 393, in sendfile
    sent += sendfile(sockno, fileno, offset + sent, count)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/http/_sendfile.py", line 66, in sendfile
    raise OSError(e, os.strerror(e))
OSError: [Errno 11] Resource temporarily unavailable

Meine letztendliche Lösung bestand darin, Gunicorn mit dem --no-sendfile -Flag zu starten, und das Problem verschwand. Warum? Ich bin mir nicht sicher ... Ich bin nur froh, dass es funktioniert.

Erwähnenswert ist auch, dass ich während meiner Fehlerbehebung mein Bestes getan habe, damit meine nginx.conf dem hier zu findenden Beispiel ähnelt: http://docs.gunicorn.org/en/stable/deploy.html

Ich treffe dieses Problem auch, 19.7.0 funktioniert gut

Tritt dies sofort auf oder nachdem eine lange Antwort teilweise gesendet wurde?

Kann eine Ursache für statische Dateien sein

Gibt es hierzu Neuigkeiten? Ich habe das gleiche Problem in 19.9.0

Alles funktionierte gut und plötzlich fing es an zu passieren.

@tilgovi lassen Sie mich wissen, wenn Sie diesbezüglich Informationen benötigen. Plötzlich tauchte dieses Problem auf

Bei mir lag das Problem am Eventlet-Worker. Ich habe Eventlet entfernt und jetzt ist alles in Ordnung.

Ich treffe auf das gleiche Problem. Und der Vorschlag von @SaintSimmo funktioniert gut für mich. Dieses Problem tritt sofort auf, wenn mit dem Herunterladen einer großen Datei begonnen wird. Ich benutze Flask und Eventlet. Und der Download-Job wird von send_from_directory von Flask erledigt.
Das Gunicorn wird mit folgendem Befehl gestartet:
gunicorn --worker-class eventlet -w 1 -b 0.0.0.0:4000 upload:app
was den Fehler geben wird.
wenn "--no-sendfile" im Befehl hinzugefügt wird, wird keine Fehlermeldung gesendet. Wenn der Download-Job ohne "sendfile" durchgeführt werden kann, wann sollte dieses "sendfile" verwendet werden?

Gunicorn (Version 19.9.0) gleiches Problem mit Eventlet

Am 19.9.0 hat die Empfehlung von @SaintSimmo, --no-sendfile einzustellen, auch für mich funktioniert.

Ja, das gleiche Problem und nach dem Entfernen des Eventlet-Workers funktioniert es einwandfrei.

Wenn ich den Server mit diesem Befehl starte (gunicorn -w 1 -k eventlet -b 127.0.0.1:5000 wsgi:app), erhalte ich die folgenden Ausnahmen und mein Bild wird bei der Client-Antwort abgeschnitten.
[ERROR] Socket-Fehler bei der Verarbeitungsanforderung.
...
BlockingIOError: [Errno 11] Ressource vorübergehend nicht verfügbar

Wenn Sie die Definition der Arbeiterklasse entfernen, funktioniert es.
gunicorn -w 1 -b 127.0.0.1:5000 wsgi:app

@jacebrowning und @SaintSimmo , ich bestätige, dass der zusätzliche Parameter --no-sendfile in den Gunicorn-Befehl wirksam ist.

Dies liegt normalerweise daran, dass nproc zu wenig ist. Sie können die Anzahl der nproc für den Benutzer erhöhen, der dieses Programm ausführt, indem Sie die Datei ' /etc/security/limits.conf ' bearbeiten.

Leiden Sie unter diesem Problem? Wenn Sie Python 3.4 oder höher verwenden, aktualisieren Sie Ihre Gunicorn-Version.

Ich hatte das gleiche Problem mit --worker-class. Ich habe Gunicorn auf 20.0.4 aktualisiert und das Problem wurde behoben.

Der Wechsel der Arbeiterklasse zu gevent hat bei mir funktioniert. --worker-class gevent

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen