Quero configurar a limitação de recursos do cgroups V2 em um contêiner Docker-Compose. Como faço isso?
relate perguntas
-
Níveis diferenciadores no journalctl
-
Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _
-
systemd: como posso executar um script no início de um serviço, sem editar a definição do serviço
-
Use o suporte de watchdog do systemd para reiniciar o aplicativo
-
Inicie/pare o serviço systemd usando o atalho de teclado [fechado]
INTRODUÇÃO:
Eu como minha própria comida de cachorro e tenho usado essa solução por alguns anos em contêineres docker-compose voltados para o público. Então, ela é suficientemente testada em batalha e a evidência do teste no final prova que sim .
Esta solução de 2 etapas leva apenas 2 minutos para configurar o Cgroup V2 em seus contêineres Docker-Compose
REQUISITOS:
Apenas (2) requisitos:
croup_parent
diretiva deve funcionarValidado em versões anteriores às acima, mas deve ser portátil sem modificações em qualquer distribuição SystemD Linux que suporte Cgroup v2
Observe que a configuração é específica do contêiner!!! : Embora eu execute a solução em contêineres Alpine Linux e Ubuntu AARCH64, ela poderia ser em outros contêineres Docker do Arch - NÃO há configuração ou dependências no nível do contêiner.
PASSO 1: Configuração do HOST:
Crie um arquivo chamado "docker.slice" no seguinte caminho:
/etc/systemd/system/docker.slice
Abaixo está uma configuração de uso geral; ajuste para valores sensatos para seu caso de uso específico:
Leia suas novas alterações:
PASSO 2 Configuração do DOCKER-COMPOSE:
No arquivo docker-compose, na
cgroup_parent
diretiva, especifique o nome do arquivo systemd criado na Etapa 1:docker.slice
Formatação Jason : Estou inserindo (4) espaços antes de adicionar a
cgroup_parent
diretiva no 5º espaço no meu próprio arquivo docker-compose.Reinicie os contêineres docker-compose.
Agora quando você executa:
Você verá seu contêiner rodando sob o controle de recursos do Cgroups. Sua configuração do Cgroups V2 para seu contêiner docker-compose está concluída. É isso!
(ETAPA OPCIONAL) CONFIG- CONTAINER:
Reconstruir contêiner com
stress-ng
para validar a limitação de recursos está funcionando. Excluastress-ng
do seu processo de construção de contêiner após o teste ser concluído.Mas se você estiver satisfeito que a solução funciona conforme proposto depois de analisar as evidências do meu teste abaixo, você pode simplesmente pular esta etapa.
TESTE:
Teste de estresse:
Usaremos
stress-ng
dentro do contêiner para provar que nossos limites de Cgroup estão sendo aplicados. Há um zilhãostress-ng
de comandos que podemos usar para testar várias coisas, mas vou oferecer apenas um único teste, pois não é para ser um HowTo 'stress-ng'.Entre no contêiner:
Ou se
bash
estiver disponível dentro do seu contêiner (precisa adicioná-lo expressamente no Alpine Linux):Uma vez dentro do contêiner que estamos testando para limitação de recursos do Cgroup, execute o teste de estresse:
Note que definimos nossa limitação de recursos para memória para um valor máximo de 2G em
docker.slice
. Assim, vamos limitar a memória usando um valor de 4G nostress-ng
comando acima. Se tudo estiver configurado corretamente, nunca devemos ver nada acima de 2G.Limitação de recursos de monitoramento:
Em uma nova janela/guia do terminal, execute os seguintes comandos de monitoramento para validar se as limitações estão sendo aplicadas corretamente.
OBSERVAÇÃO : os comandos abaixo devem ser executados no HOST - NÃO dentro do contêiner!
Algumas capturas de tela são oferecidas abaixo para evidenciar que nossa configuração Cgroups V2 está funcionando corretamente. Observe, no entanto, que a saída após todos os
stress-ng
comandos é truncada para clareza ilustrativa.systemctl status docker.slice
:systemd-cgtop
:dmesg |grep -i oom
Saída:Observação
oom-kill:constraint=CONSTRAINT_MEMCG
. Cgroups está dando um golpestress-ng
quando tenta passar nosso limite de memória:CONCLUSÃO:
Demorei um pouco para fazer o Cgroups funcionar no docker-compose devido à falta de um HowTo abrangente. Como eu estava portando o OpenLDAP para o AARCH64, achei que valia a pena reservar um momento para documentar o processo que sigo para evitar que outros tenham que arrancar os cabelos da cabeça para fazê-lo funcionar. ;-)
De qualquer forma, HTH e outras pessoas da empresa que estavam procurando em vão por alguma ajuda de configuração-
-Terrence Houlahan