run - ¿Cómo utiliza Docker los núcleos de la CPU desde su sistema operativo anfitrión?
dockers container download (4)
Entonces, si ejecuto todos los contenedores Docker en ese host, ¿consumirán CPU / núcleos según sea necesario, como si se ejecutaran como aplicaciones normales instaladas en ese sistema operativo host?
Sí.
De forma predeterminada, el acceso de cada contenedor a los ciclos de CPU de la máquina host es ilimitado. Puede establecer varias restricciones para limitar el acceso de un contenedor dado a los ciclos de CPU de la máquina host.
¿El contenedor acoplable consumirá su propio proceso y todo el procesamiento contenido en él se adherirá al núcleo de la CPU del proceso principal?
Nop.
Docker utiliza Completely Fair Scheduler para compartir recursos de CPU entre contenedores. Por lo tanto, los contenedores tienen acceso configurable a la CPU.
¿Cómo puedo especificar un contenedor acoplable para usar una cantidad de núcleos (4 por ejemplo)? Vi que hay un indicador -C que puede apuntar a un ID de núcleo, pero parece que no hay ninguna opción para especificar que el contenedor elija N núcleos al azar.
Es más configurable. Hay más opciones de CPU en Docker que puedes combinar.
--cpus = Especifique la cantidad de recursos de CPU disponibles que puede usar un contenedor. Por ejemplo, si el equipo host tiene dos CPU y establece --cpus = "1.5", el contenedor tiene garantizado como máximo una y media de las CPU.
--cpuset-cpus Limita las CPU o núcleos específicos que un contenedor puede usar. Una lista separada por comas o un rango de CPU separados por guiones que un contenedor puede usar, si tiene más de una CPU. La primera CPU está numerada 0. Un valor válido podría ser 0-3 (para usar la primera, segunda, tercera y cuarta CPU) o 1,3 (para usar la segunda y cuarta CPU).
Mi comprensión, basada en el hecho de que Docker se basa en LXC, es que los contenedores Docker comparten varios recursos desde su sistema operativo host. Mi preocupación es con núcleos de CPU. Aquí hay un escenario:
- un host Linux OS tiene 8 núcleos
- Tengo que implementar un conjunto de contenedores Docker en el sistema operativo host anterior.
- Algunos de los contenedores acoplables que necesito desplegar serían más adecuados para usar 2 núcleos
a) Entonces, si ejecuto todos los contenedores Docker en ese host, ¿consumirán CPU / núcleos según sea necesario, como si se ejecutaran como aplicaciones normales instaladas en ese sistema operativo host?
b) ¿El contenedor acoplable consumirá su propio proceso y todo el procesamiento que contiene estará atascado en el núcleo de CPU del proceso principal?
c) ¿Cómo puedo especificar un contenedor acoplable para usar una cantidad de núcleos (4 por ejemplo)? Vi que hay un indicador -C que puede apuntar a un ID de núcleo, pero parece que no hay ninguna opción para especificar que el contenedor elija N núcleos al azar.
Actualmente, no creo que Docker proporcione este nivel de granularidad. No especifica cuántos núcleos asigna en sus archivos lxc.conf, por lo que obtendrá todos los núcleos para cada acoplador, potencialmente (o posiblemente 1, no estoy 100% seguro de eso).
Sin embargo, podría ajustar el archivo conf generado para un contenedor determinado y establecer algo así como
cpuset {
cpuset.cpus="0-3";
}
De la documentación de ORACLE:
To control a container''s CPU usage, you can use the
--cpu-period and --cpu-quota options with the docker
create and docker run commands from version 1.7.0 of Docker onward.
The --cpu-quota option specifies the number of microseconds
that a container has access to CPU resources during a
period specified by --cpu-period.
As the default value of --cpu-period is 100000, setting the
value of --cpu-quota to 25000 limits a container to 25% of
the CPU resources. By default, a container can use all available CPU resources,
which corresponds to a --cpu-quota value of -1.
Es posible que las cosas hayan cambiado en las últimas (pocas) versiones. Hoy en día puedes restringir el contenedor de tu docker con parámetros para la docker run
: el equivalente de la respuesta actual en la nueva versión del docker run ubuntu /bin/echo ''Hello world --cpuset-cpus="0-3"
es docker run ubuntu /bin/echo ''Hello world --cpuset-cpus="0-3"
Sin embargo, esto limite el proceso de docker a estas CPU, pero (por favor, corríjanme si estoy equivocado), otros contenedores también podrían solicitar el mismo conjunto. Una forma posiblemente mejor sería usar recursos compartidos de CPU.
Para obtener más información, consulte https://docs.docker.com/engine/reference/run/