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?
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)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
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)