Estoy ejecutando una aplicación Flask y la alojo en Kubernetes desde un contenedor Docker. Gunicorn está administrando trabajadores que responden a solicitudes de API.
El siguiente mensaje de advertencia aparece con regularidad y parece que las solicitudes se cancelan por algún motivo. En Kubernetes, el pod no muestra un comportamiento extraño o se reinicia y permanece dentro del 80 % de sus límites de memoria y CPU.
[2021-03-31 16:30:31 +0200] [1] [WARNING] Worker with pid 26 was terminated due to signal 9¿Cómo podemos averiguar por qué estos trabajadores son asesinados?
En mi caso, el problema fue un inicio prolongado de la aplicación causado por el calentamiento del modelo ml (más de 3 segundos)
Encontré el mismo mensaje de advertencia cuando limito la memoria de la ventana acoplable, uso like -m 3000m .
y
gunicorn-¿Por qué los trabajadores son asesinados en silencio?
La forma sencilla de evitar esto es configurar una memoria alta para Docker o no configurarla.
En nuestro caso, la aplicación tardó entre 5 y 7 minutos en cargar los modelos y diccionarios de ML en la memoria. Entonces, agregar un período de tiempo de espera de 600 segundos resolvió el problema para nosotros.
gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8443 --timeout 600
Encontré el mismo mensaje de advertencia.
[WARNING] Worker with pid 71 was terminated due to signal 9Encontré este faq , que dice que "Una causa común de SIGKILL es cuando el asesino OOM termina un proceso debido a una condición de poca memoria".
Usé dmesg y me di cuenta de que, de hecho, se eliminó porque se estaba quedando sin memoria.
Out of memory: Killed process 776660 (gunicorn)