Directorio de artículos
Uno, Cgroup
Docker controla las cuotas de recursos utilizadas por los contenedores a través de Cgroup, incluidos los tres aspectos principales de la CPU, la memoria y el disco, que básicamente cubre las cuotas de recursos comunes y el control de uso.
Cgroup es la abreviatura de Control Groups. Es un mecanismo proporcionado por el kernel de Linux para limitar, registrar y aislar los recursos físicos (como CPU, memoria, E / S de disco, etc.) utilizados por los grupos de procesos.
Estas funciones específicas de gestión de recursos se denominan subsistemas Cgroup, que son implementados por los siguientes subsistemas principales:
blkio | Establezca restricciones en el control de entrada y salida de cada dispositivo de bloque, como: disco, CD, usb, etc. |
---|---|
UPC | Utilice el programador para proporcionar acceso a la CPU para las tareas de cgroup |
cpuacct | Generar informe de recursos de CPU para tareas de cgroup |
cpuset | Si se trata de una CPU de varios núcleos, este subsistema asignará CPU y memoria por separado para las tareas de cgroup |
dispositivos | Permitir o denegar el acceso de tareas de cgroup al dispositivo |
congelador | Pausar y reanudar las tareas de cgroup |
memoria | Establecer el límite de memoria de cada cgroup y generar informes de recursos de memoria |
net_cls | Marque cada paquete de red para un uso conveniente por parte de cgroup |
ns | Subsistema de espacio de nombres |
perf_event | Se agregaron capacidades de detección y seguimiento para cada grupo, que pueden detectar todos los subprocesos que pertenecen a un grupo específico y los subprocesos que se ejecutan en una CPU específica |
En segundo lugar, utilice la herramienta de estrés para probar
Ahora comience a usar la herramienta de prueba de esfuerzo para probar el uso de la CPU y la memoria, y use la herramienta de esfuerzo para probar la CPU y la memoria
#使用Dockerfile来创建一个stress镜像
cd /opt
mkdir stress
vim Dockerfile
FROM centos:7
MAINTAINER LIC
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
====>:wq
systemctl restart docker
docker build -t centos:stress .
1. Peso: acciones de CPU
Utilice el siguiente comando para crear un contenedor. El valor del parámetro -cpu-shares en el comando no garantiza 1 cpu o cuántos GHz de recursos de CPU se pueden obtener. Es solo un valor ponderado flexible.
docker run -itd --cpu-shares 100 centos:stress
Nota: De forma predeterminada, el recurso compartido de CPU de cada contenedor Docker es 1024. La participación de un solo recipiente no tiene sentido. Solo cuando se ejecutan varios contenedores al mismo tiempo, se puede reflejar el efecto de la ponderación de la CPU del contenedor.
Por ejemplo, los recursos compartidos de CPU de dos contenedores A y B son 1000 y 500, respectivamente. Cuando la CPU asigna segmentos de tiempo, el contenedor A tiene el doble de posibilidades de obtener segmentos de tiempo de CPU que el contenedor B.
Sin embargo, el resultado de la asignación depende del estado de ejecución del host y otros contenedores en ese momento. De hecho, no hay garantía de que el contenedor A obtenga el intervalo de tiempo de la CPU. Por ejemplo, el proceso del contenedor A siempre está inactivo, entonces el contenedor B puede obtener más segmentos de tiempo de CPU que el contenedor A. En casos extremos, por ejemplo, si solo hay un contenedor ejecutándose en el host, incluso si su parte de CPU es solo 50, puede monopolizar los recursos de CPU de todo el host.
Ejemplo: abra dos contenedores, déjelos generar 10 procesos de subfunción, ingrese al contenedor y compare el porcentaje de uso de CPU con el comando superior
docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
docker run -itd --name cpu1024 --cpu-share 1024 centos:stress stress -c 10
docker ps
docker exec -it 容器id bash
top
2. Límite de ciclo de CPU --cpu-period, --cpu-quota
Docker proporciona dos parámetros --cpu-period y --cpu-quota para controlar los ciclos de reloj de la CPU que el contenedor puede asignar.
1. –cpu-period se usa para especificar cuánto tiempo el contenedor debe redistribuir el uso de la CPU.
2. –cpu-quota se usa para especificar la cantidad máxima de tiempo que se puede usar para ejecutar el contenedor en este ciclo.
3. Cuando –cpu-quota es un múltiplo de –cpu-period, use varias CPU
A diferencia de –cpu-stress, esta configuración se refiere a un valor absoluto, y el uso de recursos de CPU por parte del contenedor nunca excederá el valor configurado.
La unidad de cpu-period y cpu-quota es microsegundo (μs). El valor mínimo de cpu-period es 1000 microsegundos, el valor máximo es 1 segundo (10 ^ 6μs) y el valor predeterminado es 0.1 segundo (100000μs).
El valor predeterminado de cpu-quota es -1, lo que significa que no hay control. Los parámetros cpu-period y cpu-quota se utilizan generalmente en combinación.
Por ejemplo: el proceso contenedor necesita usar una sola CPU durante 0,2 segundos cada 1 segundo. Puede establecer el período de cpu en 1000000 (es decir, 1 segundo) y el cpu-quota en 200000 (0,2 segundos).
Por supuesto, en el caso de varios núcleos, si se permite que el proceso contenedor ocupe completamente dos CPU, puede establecer el período de cpu en 100000 (es decir, 0,1 segundos) y la cuota de cpu en 200.000 (0,2 segundos) .
docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
docker ps
docker exec -it 容器id bash
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
3. Control del núcleo de la CPU - cpuset-spus
Para los servidores con CPU de varios núcleos, Docker también puede controlar qué núcleos de CPU ejecuta el contenedor, es decir, utilizar el parámetro –cpuset-cpus. Esto es especialmente útil para servidores con varias CPU y puede configurar el mejor rendimiento para los contenedores que requieren computación de alto rendimiento.
docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
La ejecución del comando anterior requiere que la máquina host sea de doble núcleo, lo que significa que el contenedor creado solo puede usar dos núcleos, 0 y 1. Después de ingresar al contenedor, puede usar el siguiente comando para detectar
cat /sys/fs/cgroup/cpuset/cpuset.cpus
El siguiente comando puede ver la relación de enlace entre el proceso del contenedor y el núcleo de la CPU
docker exec 容器id taskset -c -p 1
3. Uso mixto de los parámetros de control de cuotas de la CPU
Use el parámetro cpuset-cpus para especificar que el contenedor A usa el núcleo de CPU 0 y el contenedor B solo usa el núcleo de CPU 1
en el host. Solo estos dos contenedores usan los núcleos de CPU correspondientes. Cada uno de ellos ocupa todos los recursos principales y recursos compartidos de CPU no tienen ningún efecto obvio.
cpuset-cpus. El parámetro cpuset-mems solo es válido en servidores con nodos de múltiples núcleos y múltiples memorias, y debe coincidir con la configuración física real, de lo contrario no se puede lograr el propósito del control de recursos.
Cuando el sistema tiene varios núcleos de CPU, es necesario configurar el núcleo de la CPU del contenedor a través del parámetro cpuset-cpus para facilitar la prueba.
docker stop `docker ps -qa`
docker run -itd --name cpu3 --cpuset-cpus 0 --cpu-shares 512 centos:stress stress -c 1
docker run -itd --name cpu4 --cpuset-cpus 2 --cpu-shares 1024 centos:stress stress -c 1
Cuatro, límite de memoria
Al igual que en el sistema operativo, la memoria que puede usar el contenedor incluye dos partes: memoria física y Swap.
Docker usa los siguientes dos conjuntos de parámetros para controlar el uso de la memoria del contenedor.
-m o –memory: establece el límite de uso de la memoria (física), como 100M, 1024M.
–memory-swap: establece el límite de uso de memoria + intercambio.
La ejecución del siguiente comando permite que el contenedor utilice hasta 200 M de memoria y 300 M de intercambio
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动一个内存工作线程
--vm-bytes 280M:每个线程分配280M内存
De forma predeterminada, el contenedor puede usar toda la memoria libre en el host.
Similar a la configuración de cgroups de la CPU, Docker creará automáticamente el archivo de configuración de cgroup correspondiente para el contenedor en el directorio / sys / fs / cgroup / memory / docker / <id. completo del contenedor>
Si la memoria asignada por el subproceso es mayor o igual al conjunto de 300M, el subproceso de tensión informa un error y el contenedor sale.
docker run -it -m 200M --momory-swap=300M progrium/stress --vm 1 --vm-bytes 300M
Cinco, restricciones de IO de bloque
De forma predeterminada, todos los contenedores pueden leer y escribir en el disco por igual. Puede cambiar la prioridad del bloque contenedor 10 configurando el parámetro -blkio-weight.
–Blkio-weight es similar a –cpu-shares. Establece el valor de peso relativo y el valor predeterminado es 500.
En el siguiente ejemplo, el ancho de banda del contenedor A para leer y escribir en el disco es el doble que el del contenedor B.
docker run -it --name container_A --blkio-weight 600 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight
docker run -it --name container_B --blkio-weight 300 centos:stress
cat /sys/fs/cgroup/blikio.weight
1. Limitaciones de bps e iops
bps es byte por segundo, la cantidad de datos leídos y escritos por segundo.
iops es io por segundo, el número de lecturas y escrituras por segundo.
Los bps y iops del contenedor se pueden controlar mediante los siguientes parámetros:
–Device-read-bps, limitar la lectura de los bps de un determinado dispositivo
–device-write-bps, limitar la escritura a los bps de un determinado dispositivo
–device-read-iops, limitar la lectura de los iops de un determinado dispositivo
–device -write-iops, limit Escribe los iops de un dispositivo determinado
Ejemplo: limite la velocidad a la que el contenedor escribe / dev / sda a 5 MB / s.
docker run -it --device-write-bps /dev/sda:5MB centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
//可以按ctrl+ c中断查看
docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct