Marcio Cunha

Container travando? Como limitar recursos com cgroups v2

Aprenda a configurar limites estritos de CPU, memória e I/O usando o cgroups v2 diretamente no runtime de containers para evitar quedas em produção.

Marcio Cunha•4 min
Também disponível em:EnglishEspañol
Resumo
  • O cgroups v2 unifica a hierarquia de controle de recursos do Linux para gerenciar de forma precisa o consumo de hardware por containers.
  • A falta de limites de memória em ambientes produtivos frequentemente aciona o mecanismo OOM Killer do kernel, derrubando processos críticos.
  • O controle de I/O por peso e largura de banda impede que aplicações intensivas em disco monopolizem o armazenamento e prejudiquem o sistema.
  • A configuração correta de quotas de CPU evita que um único container esgote os ciclos de processamento e cause lentidão generalizada.
  • A aplicação de políticas restritivas diretamente no nível do runtime garante estabilidade e isolamento previsível para cargas de trabalho densas.

Por que seus containers travam em produção?

Quando um container começa a consumir mais recursos do que o servidor possui, o sistema operacional entra em colapso. Na prática, isso significa que a falta de limites claros permite que uma única aplicação defeituosa devore toda a memória RAM e processe requisições até esgotar a CPU, derrubando serviços vizinhos. Para entender melhor os sintomas de falhas na infraestrutura, muitas vezes precisamos auditar chamadas de sistema, tal como explicamos no guia sobre como auditar syscalls com o Strace para rastrear gargalos ocultos. O isolamento de processos no Linux depende de tecnologias de controle de recursos que evoluíram consideravelmente ao longo dos anos.

Antigamente, o gerenciamento de recursos sofria com limitações estruturais onde cada subsistema de hardware operava de maneira isolada. Isso criava conflitos de contabilidade quando múltiplos containers disputavam os mesmos barramentos de memória e armazenamento. A chegada do cgroups v2 resolveu esse problema ao unificar todas as métricas em uma única árvore hierárquica consistente. Em termos simples, o kernel agora enxerga o consumo do servidor como um condomínio organizado, onde cada morador possui uma cota intransferível de água, luz e espaço.

O que muda com a arquitetura unificada do cgroups v2?

Diferente da versão anterior, a segunda geração do control groups estabelece que apenas os processos folha na árvore podem possuir recursos associados. Isso significa que a distribuição de processamento e memória torna-se muito mais previsível, eliminando ambiguidades que antes confundiam o agendamento de tarefas do Linux. Quando configuramos corretamente essas regras no runtime de containers, garantimos que nenhum processo fuja ao controle estipulado pelos engenheiros de infraestrutura.

Para garantir que o tráfego de rede e o roteamento de pacotes não sofram interferências inesperadas durante picos de carga, vale a pena manter a estabilidade da camada de rede revisando os conceitos de conectividade, assim como abordamos no artigo sobre como configurar regras de firewall com iptables no Linux. A estabilidade operacional depende diretamente de como o sistema operacional lida com a escassez de recursos. Quando a memória se esgota, a ausência de limites configurados aciona o temido OOM Killer, o carrasco do kernel que encerra processos aleatoriamente para salvar o sistema.

Como configurar limites rígidos de memória e evitar surpresas

A memória é o recurso mais sensível em ambientes conteinerizados, pois o estouro dela não gera lentidão gradual, mas sim uma queda abrupta. Para evitar que sua aplicação seja encerrada sem aviso prévio, precisamos definir tanto o teto máximo quanto a zona de alívio de swap. Na prática, isso impede que vazamentos de código comprometam a estabilidade dos demais serviços hospedados na mesma máquina física ou virtual.

O processo de configuração exige atenção aos parâmetros aceitos pelo runtime do container, como o containerd ou Docker. A tabela abaixo resume os principais parâmetros de controle do cgroups v2 e suas respectivas funções na rotina de engenharia:

Parâmetro cgroups v2Recurso GerenciadoEfeito Prático no Container
memory.maxMemória RAMGera erro de falta de memória se ultrapassado
cpu.maxProcessadorLimita o uso de ciclos de CPU por período
io.weightArmazenamentoDefine a prioridade de acesso ao disco rígido

Como aplicar quotas estritas de CPU e largura de banda de I/O

Além da memória, o processador e o subsistema de armazenamento exigem atenção redobrada para evitar que tarefas em segundo plano estrangulem o banco de dados principal. Com o cgroups v2, podemos definir quotas baseadas em tempo de execução contínuo, garantindo que threads pesadas não monopolizem os núcleos disponíveis. O controle de I/O, por sua vez, protege os discos contra saturação excessiva causada por logs descontrolados.

Para colocar a mão na massa e aplicar essas diretrizes diretamente no seu ambiente de testes ou produção, siga os passos abaixo para configurar e validar os limites de um container em execução: Para aprofundar esses conceitos na prática em produção, confira também nossa análise técnica sobre Como testar capacitores SMD na placa com capacímetro.

  1. Localize o diretório correspondente ao container dentro da estrutura do cgroups v2 no sistema de arquivos do kernel.
  2. Ajuste o arquivo de limite de memória escrevendo o valor máximo desejado em bytes diretamente na controladora correspondente.
  3. Configure a quota de CPU definindo o limite de tempo computacional permitido por ciclo de agendamento do kernel.

Considerações finais sobre resiliência de infraestrutura

Dominar o cgroups v2 deixou de ser um diferencial estético e passou a ser um requisito básico para engenheiros que lidam com alta densidade de containers. Ao impor limites estritos de CPU, memória e I/O, transformamos ambientes voláteis em estruturas previsíveis e altamente resilientes a falhas. O investimento de tempo na configuração correta do runtime previne incidentes críticos e garante uma operação tranquila para desenvolvedores e usuários finais.