Estoy ejecutando una aplicación de flask con clase de trabajador gunicorn y gevent . En mi propio entorno de prueba, sigo la guía oficial multiprocessing.cpu_count() * 2 + 1 para establecer el número de trabajador.
Si quiero poner la aplicación en el pod de Kubernetes y asumir que los recursos serán como
resources: limits: cpu: "10" memory: "5Gi" requests: CPU: "3" memory: "3Gi"¿Cómo calcular el número de trabajadores? ¿Debo usar límites de CPU o solicitudes de CPU?
PD. Estoy lanzando la aplicación a través de un archivo binario empaquetado por pyinstaller , en esencia, flask run(python script.py) y lanzar gunicorn en el hilo principal:
def run(): ... if config.RUN_MODEL == 'GUNICORN': sys.argv += [ "--worker-class", "event", "-w", config.GUNICORN_WORKER_NUMBER, "--worker-connections", config.GUNICORN_WORKER_CONNECTIONS, "--access-logfile", "-", "--error-logfile", "-", "-b", "0.0.0.0:8001", "--max-requests", config.GUNICORN_MAX_REQUESTS, "--max-requests-jitter", config.GUNICORN_MAX_REQUESTS_JITTER, "--timeout", config.GUNICORN_TIMEOUT, "--access-logformat", '%(t)s %(l)s %(u)s "%(r)s" %(s)s %(M)sms', "app.app_runner:app" ] sys.exit(gunicorn.run()) if __name__ == "__main__": run() PD. Ya sea que establezca el número de trabajadores por limits CPU (10*2+1=21) o requests CPU (3*2+1=7) , el rendimiento aún no puede alcanzar mis expectativas. Cualquier sugerencia de prueba para mejorar el rendimiento será bienvenida en estas preguntas.
¿Cómo calcular el número de trabajadores? ¿Debo usar límites de CPU o solicitudes de CPU?
Eso depende de tu situacion. Primero, mire la documentación sobre solicitud y límites (este ejemplo es para memoria, pero lo mismo es para CPU).
Si el nodo donde se ejecuta un pod tiene suficiente recurso disponible, es posible (y está permitido) que un contenedor use más recursos de los que especifica su
requestpara ese recurso. Sin embargo, un contenedor no puede usar más que sulimitde recursos.Por ejemplo, si establece una solicitud de
memoryde 256 MiB para un contenedor y ese contenedor está en un pod programado para un nodo con 8 GiB de memoria y ningún otro pod, entonces el contenedor puede intentar usar más RAM.Si establece un límite de
memoryde 4 GiB para ese contenedor, el kubelet (y el tiempo de ejecución del contenedor ) imponen el límite. El tiempo de ejecución evita que el contenedor use más del límite de recursos configurado. Por ejemplo: cuando un proceso en el contenedor intenta consumir más de la cantidad de memoria permitida, el kernel del sistema finaliza el proceso que intentó la asignación, con un error de falta de memoria (OOM).
Respondiendo a su pregunta: en primer lugar, necesita saber cuántos recursos (por ejemplo, CPU) necesita su aplicación. La solicitud será la cantidad mínima de CPU que la aplicación debe recibir (tiene que calcular este valor usted mismo. En otras palabras, debe saber cuánto necesita la aplicación de CPU mínima para ejecutarse correctamente y luego debe establecer el valor). Para Por ejemplo, si su aplicación funcionará mejor cuando reciba más CPU, considere agregar un límite (esta es la cantidad máxima de CPU que una aplicación puede recibir). Si desea calcular el número de trabajadores en función del rendimiento más alto, use el limit para calcular el valor. Si, por el contrario, desea que su aplicación funcione sin problemas (quizás no tan rápido como sea posible, pero consumirá menos recursos), use el tipo de request .