Actualmente estoy construyendo un sistema que ejecuta servicios en implementaciones individuales en un clúster de kubernetes y requiere la limitación de núcleos visibles dentro del contenedor.
Especificaciones del nodo:
8 núcleos
16 GB de memoria
Cuando implemento, inicio sesión en el contenedor e inspecciono el recuento de núcleos con el módulo de multiprocessing de Python, obtengo el siguiente resultado:
In [1]: import multiprocessing In [2]: multiprocessing.cpu_count() Out[2]: 8Esta salida es correcta ya que mi nodo tiene 8 núcleos.
Lo que me gustaría es que el contenedor devuelva un recuento de núcleos de 1 como el recuento de núcleos al ejecutar el mismo comando multiprocessing.cpu_count() .
El ejemplo de caso de uso para esto es el siguiente:
El desarrollador crea servicios api que ejecutan python y gunicorn, el comportamiento predeterminado de gunicorn es crear trabajadores para la cantidad de núcleos disponibles.
Lo anterior será un problema cuando al pod solo se le permitan 100 m de CPU y 300 m de memoria, ya que los 8 trabajadores en algún momento llenarán la memoria y el pod se bloqueará. También me gustaría ocultar esto por el bien de una posible confusión e inesperado. comportamiento al detectar recursos programáticamente.
Intenté usar el --cpuset-cpus=0 porque se destacó como una solución potencial, pero por lo que entiendo y experimenté es que esto simplemente limitará el contenedor al núcleo especificado, que no oculta los otros 7 núcleos. .
Hay alguna manera de hacer esto, cualquier ayuda será apreciada.
Podría tener una variable de entorno NUM_CPUS que, si está presente, debería usarla en lugar de multiprocessing.cpu_count() . Algo como:
import os num_cpus = os.getenv("NUM_CPUS") if num_cpus is not None: cpu_count = max(round(num_cpus), 1) else: cpu_count = multiprocessing.cpu_count()