Mientras desarrollas y operas aplicaciones con MongoDB, es posible que necesites analizar el rendimiento de la aplicación y su base de datos. Cuando se experimenta un rendimiento degradado, a menudo se debe a las estrategias de acceso a la base de datos, la disponibilidad del hardware y el número de conexiones abiertas a la base de datos.
Algunos usuarios pueden experimentar limitaciones de rendimiento como resultado de estrategias de indexación inadecuadas o inapropiadas, o como consecuencia de patrones de diseño de esquema deficientes. Rendimiento de bloqueo discute cómo estos pueden afectar el bloqueo interno de MongoDB.
Los problemas de rendimiento pueden indicar que la base de datos está funcionando a su máxima capacidad y que es hora de añadirle capacidad. En particular, el conjunto de trabajo de la aplicación debe caber en la memoria física disponible.
En algunos casos, los problemas de rendimiento pueden ser temporales y estar relacionados con una carga de tráfico anormal. Como se explica en Número de conexiones, el escalado puede ayudar a reducir el tráfico excesivo.
El perfilado de la base de datos puede ayudar a entender qué operaciones están causando la degradación.
Rendimiento de bloqueo
MongoDB utiliza un sistema de bloqueo para garantizar la consistencia de los conjuntos de datos. Si ciertas operaciones son de larga duración o se forma una cola, el rendimiento se degradará mientras las solicitudes y operaciones esperan el bloqueo.
Las ralentizaciones relacionadas con el bloqueo pueden ser intermitentes. Para ver si el bloqueo ha estado afectando tu rendimiento, consulta sección debloqueos y la sección globalLock del serverStatus salida.
Nota
Algunos campos de respuesta serverStatus no se devuelven en los clústeres gratuitos o clústeres Flex de MongoDB Atlas. Para obtener más información, consulta Comandos Limitados en la documentación de MongoDB Atlas.
Dividir locks.<type>.timeAcquiringMicros por puede dar un tiempo de espera promedio aproximado para un modo de bloqueo locks.<type>.acquireWaitCount particular.
locks.<type>.deadlockCount Proporcionar el número de veces que las adquisiciones de bloqueo encontraron bloqueos.
Si es constantemente alto, es posible que haya un gran número de solicitudes esperando un bloqueo. Esto indica un posible problema de concurrencia que podría estar afectando el globalLock.currentQueue.total rendimiento.
Si globalLock.totalTime es alto en relación con uptime, la base de datos ha estado en un estado de bloqueo durante un tiempo significativo.
Las queries largas pueden resultar del uso ineficaz de índices, de un diseño de esquema no óptimo, de una estructura deficiente de la query, de problemas de arquitectura del sistema o de una memoria RAM insuficiente que conduce a lecturas desde el disco.
Número de conexiones
En algunos casos, el número de conexiones entre las aplicaciones y la base de datos puede sobrepasar la capacidad del servidor para gestionar las solicitudes. Los siguientes campos en el serverStatus documento pueden proporcionar perspectiva:
connectionses un contenedor para los siguientes dos campos:connections.currentel número total de clientes actuales conectados a la instancia de base de datos.connections.availableel número total de conexiones no utilizadas disponibles para nuevos clientes.
Si hay muchas solicitudes simultáneas de aplicaciones, la base de datos podría tener dificultades para mantenerse al día con la demanda. Si este es el caso, incrementa la capacidad de tu implementación.
Para aplicaciones con mucha escritura, implementa particionado y añade una o más particiones a un clúster para distribuir la carga entre instancias de mongod.
Los picos en el número de conexiones también pueden ser el resultado de errores en la aplicación o el controlador. Todos los controladores de MongoDB oficialmente compatibles implementan el agrupamiento de conexiones, lo que permite a los clientes usar y reutilizar conexiones de manera más eficiente. Un número extremadamente alto de conexiones, especialmente sin una carga de trabajo correspondiente, suele ser indicativo de un error de controlador u otra configuración.
Límites de conexión autogestionados
A menos que esté restringido por límites a nivel de sistema, el número máximo de conexiones entrantes admitidas por MongoDB se configura con el maxIncomingConnections ajuste. En sistemas basados en Unix, los límites a nivel de sistema se pueden modificar utilizando el comando ulimit o editando el archivo /etc/sysctl de tu sistema. Consulta Configuraciones de UNIX ulimit para implementaciones autogestionadas para obtener más información.
Límites de conexión de MongoDB Atlas
MongoDB Atlas establece el límite de conexiones entrantes simultáneas según el nivel y la clase del clúster. Para obtener más información, consulte Límites de conexión y nivel del clúster en la documentación de Atlas.