Configurações do UNIX ulimit
para sistemas autogerenciados
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 usado pela instância do
mongod
quandostorage.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.
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 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.
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 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 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. |