Estratégias para Controle e Limitação de Memória no MongoDB

O gerenciamento eficiente de recursos é fundamental para manter a estabilidade de instâncias do MongoDB, especialmente em ambientes compartilhados ou baseados em containers. Existem duas abordagens principais para restringir o consumo de recursos: através das ferrametnas de oruqestração (como Docker) ou via parâmetros internos do motor de armazenamento WiredTiger.

1. Restrições de Recursos via Docker

Ao implementar o MongoDB utilizando Docker, é possível aplicar limites rígidos de hardware diretamente na criação do container. Isso evita que o processo mongod consuma toda a RAM do hospedeiro em picos de carga.

Limites de Memória e Swap

Os parâmetros a seguir controlam como o container interage com a memória física e a área de troca:

  • --memory ou -m: Define o limite máximo de memória física. Exemplo: 512m, 2g.
  • --memory-swap: Define o total acumulado de memória RAM + Swap. Deve ser sempre maior que o valor definido em -m.
  • --memory-swappiness: Controla a tendência do kernel de mover processos da RAM para o swap (valor entre 0 e 100).
# Exemplo: Limitando a 512MB de RAM e desativando swap agressivo
docker run -d \
  --name mongo-prod \
  -m 512M \
  --memory-swappiness=0 \
  mongo:latest

Se você definir --memory-swap como -1, o container terá a memória RAM limitada pelo parâmetro -m, mas poderá utilizar swap de forma ilimitada conforme a disponibilidade do host.

Restrições de Processamento (CPU)

Além da memória, é recomendável limitar o uso de CPU para garantir que outros serviços não fiquem sem ciclos de processamento:

# Executar o MongoDB utilizando apenas os núcleos 0 e 1 do processador
docker run -d \
  --cpuset-cpus="0,1" \
  --cpu-shares=512 \
  mongo:latest

2. Configuração do Cache Interno (WiredTiger)

Desde a versão 3.2, o MongoDB utiliza o WiredTiger como motor padrão. Por natureza, o WiredTiger tenta reservar uma porção significativa da RAM para seu cache interno para acelerar as operações de leitura e escrita. Se não configurado, ele pode ocupar 50% da RAM disponível (menos 1GB em versões recentes), o que pode causar conflitos em containers onde o limite do Docker é menor que a percepção de memória do sistema operacional.

Abaixo, um exemplo de arquivo de configuração (mongod.conf) otimizado para limitar o uso de memória:

storage:
  # Diretório para armazenamento dos arquivos de dados
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      # Define o tamanho do cache do WiredTiger em GB. 
      # No exemplo abaixo, limitamos a 2GB.
      cacheSizeGB: 2

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

net:
  port: 27017
  bindIp: 0.0.0.0
  # Proteção contra excesso de conexões simultâneas
  maxIncomingConnections: 5000

Considerações sobre o cacheSizeGB

Este parâmetro é o controle mais importante para a saúde do MongoDB. Ele não limita o uso total da memória do processo mongod (que ainda usará memória para conexões, índices e operações de agregação), mas limita a área de cache de dados brutos. Se o MongoDB estiver rodando dentro de um container Docker limitado a 4GB de RAM, é prudente configurar o cacheSizeGB para algo em torno de 1.5GB a 2GB, deixando margem para o sistema operacional e para as operações internas do banco.

Para aplicar as alterações via arquivo de configuração, inicie o serviço apontando para o caminho do arquivo:

mongod --config /etc/mongod.conf

Tags: mongodb Docker wiredtiger database-administration Performance-Tuning

Publicado em 10-14 04:20