He configurado gunicorn con 3 trabajadores 30 conexiones de trabajadores y uso de clase de trabajador eventlet. Está configurado detrás de Nginx. Después de cada pocas solicitudes, veo esto en los registros.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
¿Por qué está pasando esto? ¿Cómo puedo averiguar qué va mal?
Gracias
Gunicorn==19.3.1
ygevent==1.0.1
Respuestas:
Tuvimos el mismo problema al usar Django + nginx + gunicorn. A partir de la documentación de Gunicorn, hemos configurado el elegante tiempo de espera que casi no hizo ninguna diferencia.
Después de algunas pruebas, encontramos la solución, el parámetro a configurar es: tiempo de espera (y no tiempo de espera agraciado). Funciona como un reloj ...
Entonces, haz:
1) abre el archivo de configuración gunicorn
2) configure el TIEMPO DE ESPERA según lo que necesite: el valor está en segundos
fuente
pip install gevent
luegoworker_class gevent
en su archivo de configuración o-k gevent
en la línea de comando.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
En Google Cloud, simplemente agregue
--timeout 90
al punto de entrada enapp.yaml
fuente
Ejecuta Gunicorn con
--log-level=DEBUG
.Debería darte un seguimiento de la pila de aplicaciones.
fuente
--log-level debug
¿Podría ser esto? http://docs.gunicorn.org/en/latest/settings.html#timeout
Otras posibilidades podrían ser que su respuesta esté tardando demasiado o esté atascada esperando.
fuente
Necesita usar otra clase de tipo trabajador, una asíncrona como gevent o tornado, vea esto para obtener más explicaciones: Primera explicación:
Segundo :
fuente
Tuve un problema muy similar, también intenté usar "runserver" para ver si podía encontrar algo, pero todo lo que tenía era un mensaje
Killed
Entonces pensé que podría ser un problema de recursos, y seguí adelante para darle más RAM a la instancia, y funcionó.
fuente
WORKER TIMEOUT
significa que su aplicación no puede responder a la solicitud en un período de tiempo definido. Puede configurar esto usando la configuración de tiempo de espera de gunicorn . Algunas aplicaciones necesitan más tiempo para responder que otras.Otra cosa que puede afectar esto es elegir el tipo de trabajador
Cuando tuve el mismo problema que el tuyo (estaba tratando de implementar mi aplicación usando Docker Swarm), intenté aumentar el tiempo de espera y usar otro tipo de clase de trabajador. Pero todo falló.
Y de repente me di cuenta de que estaba limitando mi recurso demasiado bajo para el servicio dentro de mi archivo de redacción . Esto es lo que ralentizó la aplicación en mi caso
Por lo tanto, le sugiero que compruebe qué cosa ralentiza su aplicación en primer lugar
fuente
¿Este punto final toma demasiado tiempo?
Tal vez esté utilizando un matraz sin soporte asíncrono, por lo que cada solicitud bloqueará la llamada. Para crear soporte asíncrono sin dificultad, agregue el
gevent
trabajador.Con gevent, una nueva llamada generará un nuevo hilo, y su aplicación podrá recibir más solicitudes
fuente
Tengo el mismo problema en Docker.
En Docker mantengo
LightGBM
modelos entrenados +Flask
solicitudes de servicio. Como servidor HTTP que utilicégunicorn 19.9.0
. Cuando ejecuté mi código localmente en mi computadora portátil Mac, todo funcionó a la perfección, pero cuando ejecuté la aplicación en Docker mis solicitudes POST JSON se congelaron por un tiempo, luegogunicorn
trabajador había fallado con la[CRITICAL] WORKER TIMEOUT
excepción.Intenté toneladas de enfoques diferentes, pero el único que resolvió mi problema fue agregar
worker_class=gthread
.Aquí está mi configuración completa:
fuente
Si está utilizando GCP, debe configurar los trabajadores por tipo de instancia.
Enlace a las mejores prácticas de GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
fuente
el tiempo de espera es un parámetro clave para este problema.
Sin embargo, no es adecuado para mí.
descubrí que no hay un error de tiempo de espera de gunicorn cuando configuro los trabajadores = 1.
cuando miro mi código, encontré algo de conexión de socket (socket.send & socket.recv) en el servidor init.
socket.recv bloqueará mi código y es por eso que siempre expira cuando los trabajadores> 1
espero dar algunas ideas a las personas que tienen algún problema conmigo
fuente
Esto funcionó para mí:
Si tiene
eventlet
agregar:Si tiene
gevent
agregar:fuente
Para mí, la solución era agregar
--timeout 90
a mi punto de entrada, pero no funcionaba porque tenía DOS puntos de entrada definidos, uno en app.yaml y otro en mi Dockerfile. Eliminé el punto de entrada no utilizado y agregué--timeout 90
el otro.fuente