Configurando CPU y Memoria
Imaginemos que necesitas levantar cuatro containers para un proyecto nuevo. Estos containers poseen las siguientes características:
-
Dos web servers.
-
Dos DB MySQL.
Evidentemente, al tratarse de servicios diferentes, en la mayoría de los casos poseen características de consumo de recursos, como CPU y memoria, diferentes uno del otro.
-
Web server -- 0,5 CPU | 128 MB de memoria
-
DB MySQL -- 1 CPU | 256 MB de memoria
¿Y ahora, cómo lo hacemos? :(
Por defecto, cuando ejecutas un container sin especificar la cantidad de recursos que utilizará, se levanta sin control, pudiendo incluso impactar el host donde está siendo ejecutado.
Por lo tanto, es muy importante limitar la utilización de recursos de tus containers, buscando un mejor aprovechamiento de tus recursos computacionales, como veremos ahora. :)
5.1. Especificando la cantidad de memoria
Primero, vamos a ejecutar un container para realizar nuestro ejemplo.
root@linuxtips:~# docker container run -ti --name teste debian
Ahora vamos a visualizar la cantidad de memoria que está configurada para este container. Una forma fácil es utilizar la salida del comando "docker container inspect":
root@linuxtips:~# docker container inspect teste | grep -i mem
"CpusetMems": "",
"KernelMemory": 0,
"Memory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
Como podemos observar, los valores correspondientes a la memoria están en cero, es decir, sin ningún límite establecido.
Vamos ahora a levantar un nuevo container, pero pasando los valores para que utilice 512 MB de memoria:
root@linuxtips:~# docker container run -ti -m 512M --name novo_container debian
Utilizamos el parámetro "-m" para especificar la cantidad de memoria que deseamos asignar al container. Vamos a utilizar "docker container inspect" nuevamente para verificar si nuestra configuración funcionó:
root@linuxtips:~# docker container inspect novo_container | grep -i mem
"CpusetMems": "",
"KernelMemory": 0,
"Memory": 536870912,
"MemoryReservation": 0,
"MemorySwap": -1,
"MemorySwappiness": -1,
¡Muy bien, parece que funcionó!
Podemos ver en el campo "Memory" el valor utilizado en la creación del container. Vale destacar que el valor mostrado es en bytes.
Cuando utilizas el parámetro "-m" o "--memory", estás indicando el máximo de memoria que el container utilizará del host.
5.2. Especificando la cantidad de CPU
Para poder limitar la cantidad de CPUs que los containers van a consumir, basta utilizar el parámetro "--cpu". Con él es posible indicar la cantidad de CPUs que deseas asignar a determinado container. Por ejemplo, si utilizamos "--cpus=0.5" estamos diciéndole a Docker que limite el consumo del container a medio CPU. Fácil, ¿no?
# docker container run --cpus=0.5 --name teste1 nginx
Con el comando anterior, estamos levantando un container utilizando la imagen de Nginx -- hasta aquí ninguna novedad, ¿cierto? Sin embargo, ahora pasamos el parámetro "--cpus=0.5" indicándole a Docker que este container podrá utilizar como máximo 0,5 CPU, es decir, la mitad de 1 core. :D Sencillo como volar.
Para verificar, vamos a utilizar el comando "docker container inspect":
root@linuxtips:~# docker container inspect teste1 | grep -i cpu
"CpuShares": 0,
"NanoCpus": 500000000,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpusetCpus": "",
"CpusetMems": "",
El campo "NanoCpus" muestra la información que configuramos. :)
¡Sencillo, fácil y rápido!
5.3. ¿Puedo alterar CPU y memoria de mis containers en ejecución?
¡Sí! \o/
Con el lanzamiento de la versión 1.10 de Docker, tenemos el comando "docker update", que permite alterar las configuraciones referentes a CPU, memoria e I/O con el container en ejecución de forma muy simple. ¡Esto es fantástico!
Como ejemplo, vamos a levantar un container y también alterar las informaciones referentes a memoria y CPU:
root@linuxtips:~# docker container run -ti --cpus=4 -m 512m --name teste1 nginx
root@linuxtips:~# docker container inspect teste1 | grep -i cpu
"CpuShares": 0,
"NanoCpus": 4000000000,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpusetCpus": "",
"CpusetMems": "",
root@linuxtips:~# docker container inspect teste1 | grep -i mem
"CpusetMems": "",
"KernelMemory": 0,
"Memory": 536870912,
"MemoryReservation": 0,
"MemorySwap": -1,
"MemorySwappiness": -1,
Ahora, vamos a alterar los valores de límite de CPU y memoria:
root@linuxtips:~# docker container update -m 256m --cpus=1 teste1
teste1
root@linuxtips:~# docker container inspect teste1 | grep -i cpu
"CpuShares": 0,
"NanoCpus": 1000000000,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpusetCpus": "",
"CpusetMems": "",
root@linuxtips:~# docker container inspect teste1 | grep -i mem
"CpusetMems": "",
"KernelMemory": 0,
"Memory": 268435456,
"MemoryReservation": 0,
"MemorySwap": -1,
"MemorySwappiness": -1,
¿Funcionó? ¡¡¡SÍÍÍ!!!
Así, con los containers en ejecución, cambiamos las informaciones referentes a la memoria y al CPU.
Existen otros parámetros del "docker container update". Para verificar la lista completa, escribe "docker update --help".