Desempenho do MongoDB
Nesta página
Ao desenvolver e operar aplicativos com o MongoDB, talvez seja necessário analisar o desempenho do aplicativo e de seu banco de dados. Quando você encontra um desempenho degradado, geralmente é por causa das estratégias de acesso ao banco de dados, da disponibilidade do hardware e do número de conexões abertas ao banco de dados.
Alguns usuários podem enfrentar limitações de desempenho como resultado de estratégias de indexação inadequadas ou inapropriadas, ou como consequência de padrões de projeto de esquema ruins. O Desempenho de Bloqueio discute como eles podem afetar o bloqueio interno do MongoDB.
Problemas de desempenho podem indicar que o banco de dados está operando na capacidade e que é hora de adicionar capacidade adicional ao banco de dados. Em particular, o conjunto de trabalho do aplicativo deve caber na memória física disponível.
Em alguns casos, os problemas de desempenho podem ser temporários e relacionados a uma carga anormal de tráfego. Conforme discutido em Número de conexões, o dimensionamento pode ajudar a aliviar o tráfego excessivo.
A análise de banco de dados pode ajudar você a entender quais operações estão causando degradação.
Desempenho de trava
O MongoDB usa um sistema de bloqueio para garantir a consistência do conjunto de dados. Se determinadas operações durarem muito tempo ou se formar uma fila, o desempenho diminuirá à medida que as solicitações e operações aguardarem a trava.
As desacelerações relacionadas ao bloqueio podem ser intermitentes. Para ver se o bloqueio está afetando seu desempenho, consulte a seção de bloqueios e a seção globalLock da saída serverStatus
.
Observação
Alguns campos de resposta serverStatus
não são retornados em clusters do MongoDB Atlas M0/M2/M5 . Para mais informações, consulte Comandos limitados na documentação do MongoDB Atlas .
Dividir locks.<type>.timeAcquiringMicros
por locks.<type>.acquireWaitCount
pode fornecer um tempo médio aproximado de espera para um modo de bloqueio específico.
locks.<type>.deadlockCount
fornece o número de vezes que as aquisições de trava encontraram imprevistos.
Se globalLock.currentQueue.total
for consistentemente alto, então há uma chance de que um grande número de solicitações esteja aguardando uma trava. Isso indica um possível problema de simultaneidade que pode estar afetando o desempenho.
Se globalLock.totalTime
for alto em relação a uptime
, o banco de dados existiu em um estado de bloqueio por um período significativo de tempo.
Consultas longas podem resultar do uso ineficaz de índices; projeto de esquema não ótimo; estrutura de consulta deficiente; problemas de arquitetura de sistemas; ou RAM insuficiente, resultando em leituras de disco.
Número de conexões
Em alguns casos, o número de conexões entre os aplicativos e o banco de dados pode sobrecarregar a capacidade do servidor de lidar com as solicitações. Os seguintes campos no documento serverStatus
podem fornecer informações:
connections
é um contêiner para os dois campos a seguir:connections.current
o número total de clientes atuais conectados à instância do banco de dados.connections.available
o número total de conexões não utilizadas disponíveis para novos clientes.
Se houver inúmeras solicitações de aplicativos simultâneas, o banco de dados poderá ter problemas para acompanhar a demanda. Se for esse o caso, aumente a capacidade do sistema.
Para aplicativos com gravação pesada, implemente fragmentação e adicione um ou mais fragmentos a um cluster fragmentado para distribuir a carga entre as instâncias de mongod
.
Os picos no número de conexões também podem ser o resultado de erros no aplicativo ou no driver. Todos os drivers MongoDB oficialmente suportados implementam o pool de conexões, o que permite que os clientes usem e reutilizem conexões com mais eficiência. Um número extremamente alto de conexões, particularmente sem volume de trabalho correspondente, geralmente é indicativo de um erro de driver ou de outra configuração.
Limites de conexão autogerenciados
A menos que seja restringido por limites de todo o sistema, o número máximo de conexões de entrada suportadas pelo MongoDB é configurado com a definição maxIncomingConnections
. Nos sistemas baseados em Unix, os limites de todo o sistema podem ser modificados usando o comando ulimit
ou editando o arquivo /etc/sysctl
do sistema. Consulte Configurações do UNIX ulimit
para implantações autogerenciadas para obter mais informações.
Limites de conexão do MongoDB Atlas
O MongoDB Atlas define o limite para conexões de entrada simultâneas com base na camada e na classe do cluster. Para saber mais, consulte Limites de Conexão e Camada de Cluster na documentação do Atlas.