Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
Configurações do UNIX ulimit
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
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.
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
mongos
mantêm um pool de conexões para cada shard para que omongos
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 omongos
cria 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 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.
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 | /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.
Configurações recomendadas do ulimit
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
A partir do MongoDB 4.2, as conexões de entrada para uma instância do
mongod
oumongos
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.
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 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>
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. |