Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Configurações do UNIX ulimit

Nesta página

  • Utilização de recursos
  • Revise e defina limites de recursos

A maioria dos sistemas operacionais do tipo UNIX, incluindo Linux e macOS, fornece maneiras de limitar e controlar o uso de recursos do sistema, como threads, arquivos e conexões de rede por processo e por usuário. Esses "limites" impedem que usuários individuais usem muitos recursos do sistema. Às vezes, esses limites têm valores padrão baixos que podem causar uma série de problemas durante a operação normal do MongoDB.

mongod e mongos usam threads e descritores de arquivo para rastrear conexões e gerenciar operações internas. Esta seção descreve os padrões gerais de utilização de recursos para MongoDB. Use esses números em combinação com as informações reais sobre sua implantação e seu uso para determinar as configurações ulimit ideais.

Geralmente, todas as instâncias do mongod e mongos:

  • rastreie cada conexão recebida com dois descritores de arquivos e uma conversa.

  • acompanhe cada thread interno ou pthread como um processo do sistema.

  • Descritor de arquivo do 1 para cada arquivo de dados em uso pela instância do mongod.

  • Descritor de arquivo do 1 para cada arquivo de diário utilizado pela instância do mongod.

  • Em conjuntos de réplicas, cada mongod mantém uma conexão com todos os outros membros do conjunto.

O mongod usa threads em background para vários processos internos, incluindo collections de TTL, replicação e verificações de integridade do conjunto de réplicas, o que pode exigir um pequeno número de recursos adicionais.

Além dos threads e descritores de arquivos para conexões de clientes, mongos deve manter conexões com todos os servidores de configuração e todos os shards, o que inclui todos os membros de todos os conjuntos de réplicas.

Para mongos, considere os seguintes comportamentos:

  • As instâncias do mongos mantêm um pool de conexões para cada shard para que o mongos possa reutilizar conexões e atender rapidamente as solicitações sem precisar solicitar novas conexões.

  • Você pode limitar o número de conexões de entrada utilizando a opção de tempo de execução do net.maxIncomingConnections. Ao restringir o número de conexões de entrada, você pode evitar um efeito cascata em que o mongos cria muitas conexões nas instânciasmongod.

Você pode utilizar o comando ulimit no prompt do sistema para verificar os limites do sistema, como no exemplo a seguir:

$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 64000
-n: file descriptors 64000
-l: locked-in-memory size (kb) unlimited
-v: address space (kb) unlimited
-x: file locks unlimited
-i: pending signals 192276
-q: bytes in POSIX msg queues 819200
-e: max nice 30
-r: max rt priority 65
-N 15: unlimited

ulimit refere-se às limitações porusuário para vários recursos. Portanto, se sua instância mongod for executada como um usuário que também esteja executando vários processos ou vários processos mongod, você poderá ver a contenção desses recursos. Além disso, esteja ciente de que o valor processes (ou seja, -u) refere-se ao número combinado de processos distintos e threads de subprocesso.

No Linux, você pode alterar as configurações do ulimit emitindo um comando no seguinte formulário:

ulimit -n <value>

Existem ulimit s "hard" e "soft" que afetam o desempenho do MongoDB. O ulimit "difícil" refere-se ao número máximo de processos que um usuário pode ter ativos a qualquer momento. Este é o teto: nenhum processo não raiz pode aumentar o "difícil" ulimit. Em contraste, o ulimit "suave" é o limite que é realmente imposto para uma sessão ou processo, mas qualquer processo pode aumentá-lo até "duro" ulimit máximo.

Um "soft" ulimit baixo pode causar erros can't create new thread, closing connection se o número de conexões aumentar demais. Por esta razão, é extremamente importante definir ambos os valores ulimit para os valores recomendados.

ulimit modificará os valores "hard" e "soft", a menos que os modificadores -H ou -S sejam especificados ao modificar valores-limite.

Para muitas distribuições de Linux você pode alterar valores substituindo a opção -n para qualquer valor possível na saída de ulimit -a.

Após alterar as configurações do ulimit, você deve reiniciar o processo para aproveitar as configurações modificadas. No Linux, você pode utilizar o sistema de arquivo /proc para visualizar as limitações atuais em um processo de execução.

Dependendo da configuração de seu sistema e das definições padrão, qualquer alteração nos limites do sistema feita com ulimit pode ser revertida após a reinicialização do sistema. Verifique a documentação da distribuição e do sistema operacional para obter mais informações.

Normalmente, você deve começar amongod usando o systemctl, que usa as configurações ulimit:

systemctl start mongod.service

Se você não iniciar o mongod utilizando systemctl, o systemd substituirá algumas das configurações do ulimit. Por exemplo, se você iniciar mongod conforme mostrado no comando a seguir, será usada uma configuração de fatia de usuário (como user-1000.slice) systemd:

mongod --config ~/mongod.conf

Observação

Uma seção de usuário do systemd limita os recursos para os processos do usuário.

Para sistemas macOS que instalaram o MongoDB Community usando o método de instalação brew, o valor recomendado de arquivos abertos é definido automaticamente quando você inicia o MongoDB por meio de brew services.

Para sistemas macOS que executam o MongoDB Enterprise ou usam o método de instalação TGZ, use o comando ulimit para definir osvalores recomendados do . Consulte a documentação do seu sistema operacional para obter o procedimento preciso para alterar os limites do sistema de sistemas em execução.

O Red Hat Enterprise Linux e o CentOS 6 e 7 forçam uma limitação de processo máxima separada, nproc, que substitui as configurações do ulimit. Esse valor é definido no seguinte arquivo de configuração, dependendo da versão:

Versão
Valor
arquivo
RHEL/CentOS 7
4096
/etc/security/limits.d/20-nproc.conf
RHEL / CentOS 6
1024
/etc/security/limits.d/90-nproc.conf

Para configurar um valor do nproc para estas versões, crie um arquivo denominado /etc/security/limits.d/99-mongodb-nproc.conf com novos valores do soft nproc e hard nproc para aumentar o limite de processo. Para obter os valores recomendados, consulte Configurações ulimit recomendadas.

Com o RHEL /CentOS 8, valores nproc separados não são mais necessários. O comando ulimit é suficiente para configurar os valores máximos de processo exigidos no RHEL/CentOS 8.

Cada sistema pode ter requisitos e configurações únicos; entretanto, os seguintes limites e configurações são particularmente importantes para sistemas mongod e mongos:

  • -f (tamanho do arquivo): unlimited

  • -t (tempo de CPU): unlimited

  • -v (memória virtual): unlimited [1]

  • -l (tamanho bloqueado na memória): unlimited

  • -n (arquivos abertos): 64000

  • -m (tamanho da memória): unlimited [1] [2]

  • -u (processos/tópicos): 64000

Lembre-se sempre de reiniciar as mongod instâncias de e depois de alterar as mongos ulimit configurações de para garantir que as alterações entrem em vigor.

  • A partir do MongoDB 4.2, as conexões de entrada para uma instância do mongod ou mongos exigem dois descritores de arquivo. Em versões anteriores do MongoDB, as conexões de entrada exigiam um descritor de arquivo.

    Antes de atualizar do MongoDB 4.0 para o 4.2, talvez seja necessário aumentar o valor da configuração de ulimit de arquivos abertos (-n).

  • Para a plataforma macOS, o limite de processo recomendado é 2500, que é o valor máximo configurável para esta plataforma.

Nas distribuições Linux que usam o Upstart, é possível especificar limites nos roteiros de serviço se você iniciar instâncias mongod e/ou como serviços Upstart. Você pode fazer isso mongos usando limit stanzas.

Especifique as Configurações ulimit recomendadas como no exemplo a seguir:

limit fsize unlimited unlimited # (file size)
limit cpu unlimited unlimited # (cpu time)
limit as unlimited unlimited # (virtual memory size)
limit memlock unlimited unlimited # (locked-in-memory size)
limit nofile 64000 64000 # (open files)
limit nproc 64000 64000 # (processes/threads)

Cada limit stanza define o limite "soft" para o primeiro valor especificado e o limite "hard" para o segundo.

Depois de alterar limit stanzas, certifique-se de que as alterações surtam efeito reiniciando os serviços do aplicativo usando o seguinte formulário:

restart <service name>

Se você iniciar uma mongod e/ou mongos instância como um serviço systemd, poderá especificar limites na seção [Service] do arquivo de serviço. O arquivo de serviço tem um local como /etc/systemd/system/<process-name>.service.

Você pode definir limites usando diretivas de limite de recursos.

Especifique as Configurações ulimit recomendadas como no exemplo a seguir:

[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

Cada diretiva de limite de systemd define os limites "hard" e "soft" para o valor especificado.

Depois de alterar limit stanzas, certifique-se de que as alterações surtam efeito reiniciando os serviços do aplicativo usando o seguinte formulário:

systemctl restart <service name>

Observação

Se você instalou o MongoDB via um gerenciador de pacote como yum ou apt, o arquivo de serviço instalado como parte da sua instalação já conterá estes valores de ulimit.

Observação

Esta seção se aplica apenas aos sistemas operacionais Linux.

O sistema de arquivos /proc armazena os limites por processo no objeto do sistema de arquivos localizado em /proc/<pid>/limits, onde <pid> é o PID ou identificador de processo. Você pode utilizar a seguinte função bash para retornar o conteúdo do objeto limits para um processo ou processos com um nome fornecido:

return-limits(){
for process in $@; do
process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`
if [ -z $@ ]; then
echo "[no $process running]"
else
for pid in $process_pids; do
echo "[$process #$pid -- limits]"
cat /proc/$pid/limits
done
fi
done
}

Você pode copiar e colar esta função em uma sessão de shell atual ou carregá-la como parte de um script. Ligue para a função com uma das seguintes invocações:

return-limits mongod
return-limits mongos
return-limits mongod mongos
[1](1, 2) Se você limitar o tamanho da memória virtual ou residente em um sistema que executa o MongoDB, o sistema operacional se recusará a atender a solicitações de alocação adicionais.
[2] O parâmetro -m para ulimit não tem efeito em sistemas Linux com versões do kernel mais recentes que 2.4.30. Você pode omitir -m se desejar.
← Gerenciar a integridade do cluster fragmentado com gerenciadores de integridade