docker ------- método de configuración de recursos de Cgroup

Prefacio

Por defecto, no hay límite de recursos para un contenedor, porque es un proceso en sí mismo. Cuando un contenedor ocupa demasiados recursos, afectará a otros contenedores. Por lo tanto, la asignación razonable de los recursos del contenedor es un problema al que los administradores deben prestar atención. .
estibador pasa cgroup Para controlar la cuota recurso utilizado por el recipiente, incluyendo los tres aspectos principales de la CPU, la memoria, y el disco, que cubre básicamente cuotas de recursos comunes y control de uso

1. Configuración de recursos de Cgroup

Cgroup es la abreviatura de Grupos de control. Es un mecanismo proporcionado por el kernel de Linux para limitar, registrar y aislar los recursos físicos (como CPU, memoria, disco 10, etc.) utilizados por los grupos de procesos. Es utilizado por muchos proyectos como LXC y Docker Realice el control de recursos del proceso. Cgroup en sí es una estructura básica que proporciona funciones e interfaces para los procesos de agrupación. La gestión de recursos específicos, como E / S o control de asignación de memoria, se realiza a través de esta función. Estas funciones específicas de gestión de recursos se denominan subsistemas Cgroup. Existen los siguientes subsistemas principales :

  • blkio: configurado para limitar el control de entrada y salida de cada dispositivo, como: disco, CD, usb, etc.
  • CPU: use el programador para proporcionar acceso a la CPU para las tareas de cgroup
  • cpuacct: genera informes 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 a dispositivos mediante tareas de cgroup
  • freezer: pausa y reanuda las tareas de cgroup
  • memoria: establezca el límite de memoria de cada cgroup y genere un informe 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: Aumente las capacidades de monitoreo y seguimiento de cada grupo, que puede monitorear todos los subprocesos que pertenecen a un grupo específico y permitir subprocesos en una CPU específica

Dos, prueba la CPU y la memoria

Utilice Dockerfile para crear una imagen de herramienta de estrés basada en centos

mkdir /opt/stress
cd /opt/stress

vim Dockerfile
FROM centos:7
MAINTAINER HZH<397615552@qq.com>
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

docker build -t centos:stress .

Utilice el siguiente comando para crear un contenedor. El valor del parámetro -cpu-shares en el comando no garantiza que pueda obtener 1 vcpu o cuántos GHz de recursos de CPU, es solo un valor ponderado flexible

docker run -itd --cpu-shares 100 centos:stress

说明:默认情况下,每个Docker容器的CPU份额都是1024。 单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。
Por ejemplo: inicie 2 contenedores y permita ver el porcentaje de uso de CPU

docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10  #容器产生10个子函数进程
docker exec -it xxxxxxxx bash  		#进入容器使用top查看cpu使用情况

再开一个容器做比较
docker run -itd ---name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker exec -it xxxxxxxxx bash      #进入容器使用top对比两个容器的%CPU,比例是12

Inserte la descripción de la imagen aquí

Tres, límite de ciclo de la CPU

1. Docker proporciona dos parámetros --cpu-period y --cpu-quota para controlar los ciclos de reloj de la CPU que el contenedor puede asignar

  • --Cpu-period: se utiliza para especificar cuánto tiempo se debe redistribuir el uso de CPU del contenedor
  • --Cpu-quota: se usa para especificar el tiempo máximo que se puede usar para ejecutar el contenedor en este ciclo
  • A diferencia de –cpu-share, esta configuración es un valor absoluto especificado, 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 microsegundos.
  • El valor mínimo de -cpu-period es 1000 microsegundos, el valor máximo es 1 segundo y el valor predeterminado es 0,1 segundo
  • 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 100000 (es decir, 0,1 segundos) y la cuota de cpu en 200000 (0,2 segundos). Por supuesto, en el caso de multi-core, si está permitido Si el proceso del contenedor ocupa completamente dos CPU, puede establecer cpu-period en 100000 (es decir, 0.1 segundos) y cpu-quota en 200000 (0.2 segundos)

docker run -itd --cpu-period 100000 --cpu-quota 200000 centos:stress
docker exec -it xxxxxxxxxx
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í

Cuatro, control del núcleo de la CPU

Para servidores con CPU de varios núcleos, Docker también puede controlar qué núcleos de CPU puede usar el contenedor, es decir, usar el parámetro -cpuset-cpus.
Esto es especialmente útil para servidores con múltiples CPU y puede configurar el mejor rendimiento para contenedores. que requieren informática de alto rendimiento.

docker run -itd --name cpu1 --cpuset-cpus 2-3 centos:stress			#2-3表示创建容器只能使用第23这两个内核,
docker exec -it xxxxxxxxxxx bash
cat /sys/fs/cgroup/cpuset/cpuset.cpus

docker exec xxxxxx taskset -c -p 1
pid 1's current affinity list: 2,3

Inserte la descripción de la imagen aquí

5. Uso mixto de 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 usa solo el núcleo de CPU 3.
En el host, solo estos dos contenedores usan los núcleos de CPU correspondientes. Cada uno de ellos ocupa todos los recursos del núcleo y la CPU. acciones no tienen ningún efecto evidente
. -cpus, parámetros cpuset-MEMS sólo son válidos en los servidores en los nodos multi-núcleo y multi-memoria, y deben coincidir con la configuración física real, de lo contrario el propósito de control de recursos no se puede lograr.
en el caso de múltiples núcleos de CPU en el sistema, se debe pasar El parámetro cpuset-cpus es para configurar el núcleo de la CPU del contenedor para facilitar las pruebas

docker run -itd --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1 
docker exec -it xxxxxxxxxxx bash
exit 
top #1查看每个核心的占用

docker run -itd --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1 
docker exec -it xxxxxxx bash    

Inserte la descripción de la imagen aquí

总结:上面的centos:stress镜像安装了stress工具,用来测试CPU和内存的负载,通过在两个容器上分别执行stress -c 1命令,将会给系统一个随机负载,产生1个进程,这个进程都会反复不停的计算由rand()产生随机数的平方根,直到资源耗尽,观察到宿主机上CPU使用率,第三个内核的使用率接近100%,并且一批进程的CPU使用率明显存在2:1 的使用比例的对比

Sexto, límite de memoria

De manera similar al sistema operativo, la memoria que puede usar el contenedor incluye dos partes: la memoria física y la ventana
acoplable Swap controla el uso de la memoria del contenedor a través de los siguientes dos conjuntos de parámetros

  • -m o --memory: establece el límite de uso de memoria
  • - Intercambio de memoria: establece el límite de uso de memoria + intercambio
  • --Vm 1: iniciar 1 hilo de trabajo de memoria
  • –Vm-bytes 280M: cada subproceso asigna 280M de memoria, el valor aquí debe ser menor que –memory-swap, de lo contrario se informará un error
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M			#工作线程分配的内存超过300M或者等于300M,分配的内存超过限额,stress线程会报错,容器退出

Inserte la descripción de la imagen aquí
–Vm-bytes es igual a –memory-swap value, el resultado es un error
Inserte la descripción de la imagen aquí

Siete, limitaciones de Block IO

Por defecto, todos los contenedores pueden leer y escribir en el disco por igual. Puede cambiar la prioridad del IO del bloque contenedor a través del parámetro
–blkio-weight . –Blkio-weight es similar a –cpu-shares. El peso relativo está establecido. El valor predeterminado es 500.
Por 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/blkio/blkio.weight

Inserte la descripción de la imagen aquí

8. 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 IOs por segundo.
Los bps y iops del contenedor se pueden controlar mediante los siguientes parámetros

–Device-read-bps: límite de lectura de bps de un determinado dispositivo
–device-write-bps: límite de escritura de bps de cierto dispositivo
–device-read-iops: límite de lectura de iops de cierto dispositivo
–device-write- iops: limit Escribe los iops de un dispositivo determinado

El siguiente ejemplo es para limitar 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

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_51432789/article/details/115323438
Recomendado
Clasificación