Operación de configuración de recursos de Docker Cgroup

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 .

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


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

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí
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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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内存

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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中断查看

Inserte la descripción de la imagen aquí

docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_51432770/article/details/115320895
Recomendado
Clasificación