Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Configurações do UNIX ulimit para sistemas autogerenciados

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 usado pela instância do mongod quando storage.journal.enabled é true.

  • 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 brew services. Consulte Executar o MongoDB com brew para obter mais informações.

Para sistemas macOS executando MongoDB Enterprise ou utilizando o método de instalação TGZ, utilize o comando launchctl limit para configurar osvalores recomendados do . Consulte a documentação do sistema operacional para obter o procedimento preciso para alterar os limites do sistema 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 de nproc para estas versões, crie um arquivo denominado /etc/security/limits.d/99-mongodb-nproc.conf com novos valores de soft nproc e hard nproc para aumentar o limite de processo. Para obter os valores recomendados, consulte Configurações de 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.

  • As conexões de entrada para uma instância do mongod ou mongos exigem dois descritores de arquivo.

  • 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 mongos como serviços Upstart. Você pode fazer isso 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.

Voltar

Health managers