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.
Utilização de recursos
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.
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.
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.
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 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.
macOS
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 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
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-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.
Considerações
Distribuições Linux usando o Upstart
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 sequência de instâncias (stanzas) limit.
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 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.
/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 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. |