¿Cuántas CPU usa un contenedor Docker?

120

Digamos que estoy ejecutando un servicio de multiprocesamiento dentro de un contenedor de Docker que genera múltiples procesos, ¿Docker usaría todos / múltiples núcleos / CPU del host o solo uno?

kev
fuente
11
Se permite utilizar tantas CPU como el cgroup en el que se encuentra. Lo cual, por defecto, no está limitado. Vea --cpuset-cpussi quería cambiar eso.
Charles Duffy
3
(Un contenedor de ventana acoplable es solo un montón de espacios de nombres privados; dado que no está emulando CPU, tendría que hacer todo lo posible para imponerles restricciones; los kernels de Linux proporcionan instalaciones para permitir tal salida de de una manera, pero eso sigue siendo algo que debe realizarse explícitamente).
Charles Duffy
¿Qué hay de Docker Toolbox en Windows, que usa VirtualBox?
Egor Kraev

Respuestas:

111

Como menciona Charles, por defecto se pueden usar todos, o puede limitarlo por contenedor usando el --cpuset-cpusparámetro.

docker run --cpuset-cpus="0-2" myapp:latest

Eso restringiría el contenedor a 3 CPU (0, 1 y 2). Consulte los documentos de ejecución de la ventana acoplable para obtener más detalles.


La forma preferida de limitar el uso de CPU de los contenedores es con un límite fraccional en las CPU:

docker run --cpus 2.5 myapp:latest

Eso limitaría su contenedor a 2.5 núcleos en el host.


Por último, si ejecuta Docker dentro de una VM, incluidos Docker para Mac, Docker para Windows y Docker-machine, esas VM tendrán un límite de CPU separado de su computadora portátil. Docker se ejecuta dentro de esa máquina virtual y utilizará todos los recursos proporcionados a la propia máquina virtual. Por ejemplo, con Docker para Mac tienes el siguiente menú:

Configuración avanzada de Docker para Mac

BMitch
fuente
¿Dos contenedores de Docker que se ejecutan en la misma VM con 2 CPU afectarían el rendimiento si ambos son procesos de generación? Entonces, ¿ambos generan dos procesos para un total de cuatro cuando solo hay 2 CPU en la VM?
cocoPuffs
@cocoPuffs a menos que especifique límites de CPU, es lo mismo que si ejecuta esos procesos fuera de un contenedor en el mismo host. Agregar límites de CPU a cada contenedor puede evitar que los procesos de un contenedor utilicen todos los recursos de la CPU por sí mismos.
BMitch
Cosas realmente completas y geniales
Darragh Enright
7

Tal vez su máquina virtual host tenga solo un núcleo de forma predeterminada. Por lo tanto, primero debe aumentar el recuento de cpu de su VM y luego usar la opción --cpuset-cpus para aumentar sus núcleos de Docker. Puede eliminar la máquina virtual predeterminada de Docker con el siguiente comando y luego puede crear otra máquina virtual con recuento de cpu y tamaño de memoria opcionales :

docker-machine rm default
docker-machine create -d virtualbox --virtualbox-cpu-count=8 --virtualbox-memory=4096 --virtualbox-disk-size=50000 default

Después de este paso, puede especificar el número de núcleos antes de ejecutar su imagen. este comando utilizará 4 núcleos de un total de 8 núcleos.

docker run -it --cpuset-cpus="0-3" your_image_name

Luego, puede verificar el número de núcleos disponibles en su imagen usando este comando:

nproc
arcos
fuente