Gunicorn: OSError: [Errno 11] El recurso no está disponible temporalmente en la versión 19.8.1 (y 19.8.0) en Heroku

Creado en 29 may. 2018  ·  14Comentarios  ·  Fuente: benoitc/gunicorn

Estoy ejecutando un servidor Flask simple en Heroku:

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

Está usando Python 2.7.15 para compatibilidad con varios otros paquetes.

Parece que me encontré con un duplicado de este problema desde hace años desde que Heroku se mudó a la versión 19.8.1. Algunas imágenes (desde unos pocos kb hasta unos pocos mb de tamaño) no se cargan; Tengo un sitio con muchas imágenes (principalmente hojas de sprites para animación) y aparentemente una selección aleatoria de ellas no se cargará cada vez, cada una arrojará el siguiente error (si las imágenes se almacenan en caché desde una versión anterior, se carga sin problemas) :

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

estas son las otras versiones en los requisitos.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

Cambiar gunicorn a 19.7.1 parece resolver el problema; persiste con 19.8.0.
Al igual que con el problema similar de 2012, no es un problema de tiempo de espera de solicitud, ya que el error que arroja es bastante inmediato. Regresar a 19.7.1 lo solucionó, así que por ahora me quedaré con eso, pero sería bueno usar la última versión. Parece que esto podría ser un problema específico de Heroku; Solo me di cuenta en el último mes más o menos, pero no puedo encontrar ninguna información sobre cuándo cambiaron las versiones.

Comentario más útil

Luché con este mismo problema hoy, todo el día. Y creo que finalmente lo arreglé. Estoy usando nginx, Flask, gunicorn con eventlet y docker.

Mi salida (relevante) pip freeze :

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

Mi comando gunicornio:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

El primer síntoma fueron grandes cargas de archivos estáticos que arrojaron ERR_CONTENT_LENGTH_MISMATCH en el navegador. Obviamente, esto rompió la aplicación, ya que no se estaban cargando grandes bibliotecas JS estáticas.

El segundo síntoma fue que nginx registró lo siguiente en error.log: upstream prematurely closed connection while reading upstream

Finalmente, lo rastreé hasta un elemento de registro de gunicorn:

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

Mi solución final fue comenzar gunicorn con la bandera --no-sendfile , y el problema desapareció. ¿Por qué? No estoy seguro... Estoy feliz de que esté funcionando.

También vale la pena mencionar que, durante mi solución de problemas, hice todo lo posible para que mi nginx.conf se pareciera al ejemplo que se encuentra aquí: http://docs.gunicorn.org/en/stable/deploy.html

Todos 14 comentarios

Luché con este mismo problema hoy, todo el día. Y creo que finalmente lo arreglé. Estoy usando nginx, Flask, gunicorn con eventlet y docker.

Mi salida (relevante) pip freeze :

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

Mi comando gunicornio:
gunicorn -b 0.0.0.0:8000 --workers 1 --worker-class eventlet --log-level=DEBUG myapp.wsgi:app

El primer síntoma fueron grandes cargas de archivos estáticos que arrojaron ERR_CONTENT_LENGTH_MISMATCH en el navegador. Obviamente, esto rompió la aplicación, ya que no se estaban cargando grandes bibliotecas JS estáticas.

El segundo síntoma fue que nginx registró lo siguiente en error.log: upstream prematurely closed connection while reading upstream

Finalmente, lo rastreé hasta un elemento de registro de gunicorn:

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

Mi solución final fue comenzar gunicorn con la bandera --no-sendfile , y el problema desapareció. ¿Por qué? No estoy seguro... Estoy feliz de que esté funcionando.

También vale la pena mencionar que, durante mi solución de problemas, hice todo lo posible para que mi nginx.conf se pareciera al ejemplo que se encuentra aquí: http://docs.gunicorn.org/en/stable/deploy.html

También me encuentro con este problema, 19.7.0 funciona bien

¿Esto ocurre inmediatamente o después de que se haya enviado parcialmente una respuesta larga?

Puede ser causa de archivo estático de servicio

¿Algún avance en esto? Estoy enfrentando el mismo problema en 19.9.0

Todo estaba funcionando bien y de repente comenzó a suceder.

@tilgovi , avíseme si necesita información al respecto. De repente, este problema comenzó a aparecer

Para mí, el problema se debió al trabajador eventlet. Eliminé eventlet y todo está bien ahora.

Me encuentro con el mismo problema. Y la sugerencia de @SaintSimmo me funciona bien. Este problema ocurre inmediatamente al comenzar a descargar un archivo grande. Estoy usando matraz y eventlet. Y el trabajo de descarga lo realiza send_from_directory desde Flask.
El gunicorn se inicia con el siguiente comando:
gunicorn --eventlet de clase trabajador -w 1 -b 0.0.0.0:4000 upload:app
que dará el error.
si se agrega "--no-sendfile" en el comando, no se envía ningún mensaje de error. Si el trabajo de descarga se puede realizar sin "sendfile", entonces, ¿cuándo se debe usar este "sendfile"?

gunicorn (versión 19.9.0) mismo problema con eventlet

En 19.9.0, la recomendación de @SaintSimmo de configurar --no-sendfile también funcionó para mí.

Sí, el mismo problema y después de eliminar el trabajador eventlet, funciona bien.

Cuando inicio el servidor con este comando (gunicorn -w 1 -k eventlet -b 127.0.0.1:5000 wsgi:app) recibo las siguientes excepciones y mi imagen se trunca en la respuesta del cliente.
[ERROR] Solicitud de procesamiento de error de socket.
...
BlockingIOError: [Errno 11] Recurso temporalmente no disponible

Eliminando la definición de clase trabajadora, funciona.
gunicorn -w 1 -b 127.0.0.1:5000 wsgi:aplicación

@jacebrowning y @SaintSimmo , confirmo que el parámetro adicional --no-sendfile en el comando gunicorn es efectivo.

Esto generalmente se debe a que el nproc es demasiado bajo, puede aumentar el número de nproc para el usuario que ejecuta ese programa editando el archivo ' /etc/security/limits.conf '.

¿Estás sufriendo de este problema? Si está utilizando Python 3.4 o superior, actualice su versión de Gunicorn.

Tuve el mismo problema con --worker-class. Actualicé gunicorn a 20.0.4 y se resolvió el problema.

Cambiar la clase de trabajador a gevent funcionó para mí. --worker-class gevent

¿Fue útil esta página
0 / 5 - 0 calificaciones