docker ------- Método de configuração de recurso Cgroup

Prefácio

Por padrão, não há limite de recursos para um contêiner, porque é um processo em si. Quando um contêiner ocupa muitos recursos, ele afetará outros contêineres. Portanto, a alocação razoável de recursos do contêiner é um problema ao qual os administradores devem prestar atenção .
docker passa Cgroup Para controlar a cota de recursos usada pelo contêiner, incluindo os três aspectos principais de CPU, memória e disco, basicamente cobrindo cotas de recursos comuns e controle de uso

1. Configuração de recursos Cgroup

Cgroup é a abreviatura de Control Groups. É um mecanismo fornecido pelo kernel do Linux para limitar, registrar e isolar os recursos físicos (como CPU, memória, disco 10, etc.) usados ​​por grupos de processos. É usado por muitos projetos como LXC e docker Realize o controle de recursos do processo O próprio Cgroup é uma estrutura básica que fornece funções e interfaces para agrupar processos. O gerenciamento de recursos específicos, como E / S ou controle de alocação de memória, é realizado por meio desta função. Essas funções específicas de gerenciamento de recursos são chamadas de subsistemas Cgroup., Existem os seguintes subsistemas principais :

  • blkio: defina para limitar o controle de entrada e saída de cada dispositivo, como: disco, CD, usb, etc.
  • CPU: Use o agendador para fornecer acesso à CPU para tarefas cgroup
  • cpuacct: Gera relatórios de recursos de CPU para tarefas cgroup
  • cpuset: Se for uma CPU multi-core, este subsistema irá alocar CPU e memória separadas para tarefas cgroup
  • dispositivos: permitir ou negar acesso a dispositivos por tarefas cgroup
  • freezer: Pause e retome as tarefas do cgroup
  • memória: Defina o limite de memória de cada cgroup e gere um relatório de recurso de memória
  • net_cls: marque cada pacote de rede para uso conveniente do cgroup
  • ns: Subsistema de namespace
  • perf_event: aumenta os recursos de monitoramento e rastreamento de cada grupo, que pode monitorar todos os threads pertencentes a um grupo específico e permitir threads em uma CPU específica

Dois, teste a CPU e a memória

Use o Dockerfile para criar uma imagem de ferramenta de estresse baseada em 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 .

Use o seguinte comando para criar um contêiner. O valor do parâmetro -cpu-shares no comando não garante que você possa obter 1 vcpu ou quantos GHz de recursos de CPU, é apenas um valor ponderado flexível

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

说明:默认情况下,每个Docker容器的CPU份额都是1024。 单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。
Por exemplo: inicie 2 contêineres e permita ver a porcentagem de uso da 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

Insira a descrição da imagem aqui

Três, limite de ciclo de CPU

1. O Docker fornece dois parâmetros --cpu-period e --cpu-quota para controlar os ciclos de clock da CPU que o contêiner pode alocar

  • --Cpu-period: é usado para especificar por quanto tempo o uso da CPU do contêiner deve ser redistribuído
  • --Cpu-quota: é usado para especificar o tempo máximo que pode ser usado para executar o contêiner neste ciclo
  • Ao contrário de –cpu-share, esta configuração é um valor absoluto especificado e o uso de recursos da CPU pelo contêiner nunca excederá o valor configurado
    . A unidade de –cpu-period e –cpu-quota é de microssegundos.
  • O valor mínimo de -cpu-period é 1000 microssegundos, o valor máximo é 1 segundo e o padrão é 0,1 segundo
  • O valor padrão de –cpu-quota é -1, o que significa nenhum controle. Os parâmetros –cpu-period e –cpu-quota são geralmente usados ​​em combinação

Por exemplo: o processo de contêiner precisa usar uma única CPU por 0,2 segundos a cada 1 segundo. Você pode definir o período da CPU para 100.000 (ou seja, 0,1 segundos) e a cpu-cota para 200.000 (0,2 segundos). Claro, no caso de multi-core, se permitido. Se o processo do contêiner ocupar completamente duas CPUs, você pode definir o período da cpu para 100.000 (ou seja, 0,1 segundo) e a cpu-quota para 200000 (0,2 segundo)

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

Insira a descrição da imagem aqui

Quatro, controle do núcleo da CPU

Para servidores com CPUs de vários núcleos, o Docker também pode controlar quais núcleos de CPU o contêiner tem permissão para usar, ou seja, usar o parâmetro -cpuset-cpus.
Isso é especialmente útil para servidores com várias CPUs e pode configurar o melhor desempenho para contêineres que requerem computação de alto desempenho.

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

Insira a descrição da imagem aqui

5. Uso misto de parâmetros de controle de cota de CPU

Use o parâmetro cpuset-cpus para especificar que o contêiner A usa CPU core 0 e o contêiner B usa apenas CPU core 3.
No host, apenas esses dois contêineres usam os núcleos de CPU correspondentes. Cada um deles ocupa todos os recursos principais, e cpu- compartilhamentos não têm efeito óbvio
. -cpus, os parâmetros cpuset-mems são válidos apenas em servidores em nós de múltiplos núcleos e multi-memória e devem corresponder à configuração física real, caso contrário, o objetivo do controle de recursos não pode ser alcançado.
No caso de vários núcleos de CPU no sistema, ele precisa ser passado O parâmetro cpuset-cpus é definir o núcleo de CPU do contêiner para facilitar o teste

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    

Insira a descrição da imagem aqui

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

Sexto, limite de memória

Semelhante ao sistema operacional, a memória que o contêiner pode usar inclui duas partes: a memória física e a
janela de encaixe Troca controla o uso da memória do contêiner por meio dos dois conjuntos de parâmetros a seguir

  • -m ou --memory: define o limite de uso de memória
  • - Troca de memória: definir limite de uso de memória + troca
  • --Vm 1: inicia 1 thread de trabalho de memória
  • –Vm-bytes 280M: cada thread aloca 280M de memória, o valor aqui deve ser menor que –memory-swap, caso contrário, um erro será relatado
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线程会报错,容器退出

Insira a descrição da imagem aqui
–Vm-bytes é igual ao valor –memory-swap, o resultado é um erro
Insira a descrição da imagem aqui

Sete, limitações de bloco IO

Por padrão, todos os contêineres podem ler e gravar no disco igualmente. Você pode alterar a prioridade do bloco de contêiner IO por meio do parâmetro
–blkio-weight . –Blkio-weight é semelhante a –cpu-shares. O peso relativo é definido. O padrão é 500.
Por exemplo: A largura de banda do contêiner A para ler e gravar no disco é o dobro do contêiner 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

Insira a descrição da imagem aqui

8. Limitações de bps e iops

bps é byte por segundo: a quantidade de dados lidos e gravados por segundo
iops é io por segundo: o número de IOs por segundo.
Os bps e iops do contêiner podem ser controlados pelos seguintes parâmetros

–Device-read-bps: limita a leitura de bps de um certo dispositivo
–device-write-bps: limita a escrita de bps de um certo dispositivo
–device-read-iops: limita a leitura de iops de um certo dispositivo
–device-write- iops: limit Escreva os iops de um determinado dispositivo

O exemplo a seguir é para limitar a taxa na qual o contêiner grava / 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

Insira a descrição da imagem aqui

Acho que você gosta

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