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 vários problemas durante as operações normais do MongoDB .
Uso de recursos
mongod e usam threads e descritores de arquivos para rastrear conexões e gerenciar operações internas. Esta seção descreve os padrões gerais de uso de recursos para MongoDB. Use esses números com suas informações de sistema para determinar mongos as ulimit configurações 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.
mongod
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
mongodmantém uma conexão com todos os outros membros do conjunto.
mongod O 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 vários recursos adicionais.
mongos
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
mongosmantêm um pool de conexões para cada shard para que omongospossa 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 omongoscria muitas conexões nas instânciasmongod.
Revise e defina limites de recursos
ulimit
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 por usuário para vários recursos. Portanto, se sua instânciamongodfor executada como um usuário que também esteja executando vários processos ou vários processosmongod, você poderá ver a contenção desses recursos. 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>
ulimit tem dois tipos:
"difícil"
ulimit: o número máximo de processos que um usuário pode ter ativos a qualquer momento. Nenhum processo não raiz pode aumentá-lo."suave"
ulimit: o limite imposto para uma sessão ou processo. Qualquer processo pode aumentá-lo até o "difícil"ulimit.
Importante
Um "soft" baixoulimit pode causar can't create new thread,
closing connection erros se o número de conexões aumentar demais. Defina ambos ulimit os valores para os valores recomendados.
ulimit modifica 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.
macOS
Para sistemas macOS que instalaram o MongoDB Community Edition usando o método de instalação Homebrew, o limite de arquivos abertos pode não ser definido automaticamente ao iniciar o MongoDB por meio de brew services. Talvez seja necessário configurar manualmente os valores ulimit.
Para sistemas macOS executando MongoDB Enterprise ou utilizando o método de instalação TGZ, utilize o comando ulimit 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.
Red Hat Linux Enterprise Server e CentOS
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 |
|
RHEL / CentOS 6 | 1024 |
|
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.
Configurações recomendadas ulimit do
As configurações a seguir são particularmente importantes para mongod os sistemas mongos e:
-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-u(processos/tópicos):64000
Reinicie suas instâncias domongodemongosapós alterar as configurações do ulimit para aplicar as alterações.
Considerações
Distribuições Linux usando o Upstart
Para distribuições Linux que usam o Upstart, você pode especificar limites dentro de scripts de serviço se iniciar instâncias mongod ou como serviços do Upstart. Você pode fazer isso mongos usando limit sequência de instâncias (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>
Distribuições Linux usando systemd
Se você iniciar uma instância mongod ou como mongos um systemd serviço, poderá especificar limites na [Service] seção do arquivo de serviço. O arquivo de serviço tem um local /etc/systemd/system/<process-name>.service como.
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 por meio de 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.
/proc Sistema de arquivos
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 residente em um sistema que executa o MongoDB, o sistema operacional se recusará a atender 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. |