sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB precarga documentos en RAM para un mejor rendimiento

Su problema de rendimiento observado en una consulta inicial es probablemente uno de los siguientes problemas (en orden aproximado de probabilidad):

1) Su aplicación/servicio web tiene algunos gastos generales para inicializar en la primera solicitud (es decir, asignación de memoria, configuración de grupos de conexiones, resolución de DNS, ...).

2) Los índices o datos que ha solicitado aún no están en la memoria, por lo que deben cargarse.

3) El Optimizador de consultas puede tardar un poco más en ejecutarse en la primera solicitud, ya que está comparando la ejecución del plan para su patrón de consulta.

Sería muy útil probar la consulta a través de mongo shell y aísle si la sobrecarga está relacionada con MongoDB o su servicio web (en lugar de medir el tiempo de ambos, como lo ha hecho).

A continuación se presentan algunas notas relacionadas con MongoDB.

Almacenamiento en caché

MongoDB no tiene un tiempo de "almacenamiento en caché" para los documentos en la memoria. Utiliza archivos asignados a la memoria para la E/S del disco y los documentos en la memoria se basan en sus consultas activas (documentos/índices que cargó recientemente), así como en la memoria disponible. El administrador de memoria virtual del sistema operativo está a cargo del almacenamiento en caché y, por lo general, seguirá un algoritmo de uso menos reciente (LRU) para decidir qué páginas intercambiar fuera de la memoria.

Uso de memoria

El comportamiento esperado es que, con el tiempo, MongoDB crecerá para usar toda la memoria libre para almacenar su conjunto de datos de trabajo activo.

Mirando su db.stats() proporcionado números (y suponiendo que sea su único base de datos), parece que el tamaño actual de su base de datos es de aproximadamente 1 Gb, por lo que debería poder mantener todo dentro de su RAM total de 10 Gb a menos que:

  • hay otros procesos que compiten por la memoria
  • has reiniciado tu mongod servidor y esos documentos/índices aún no se han solicitado

En MongoDB 2.2, hay un nuevo touch comando que puede usar para cargar índices o documentos en la memoria después de reiniciar el servidor. Esto solo debe usarse en el inicio inicial para "calentar" el servidor, ya que de lo contrario podría forzar inútilmente los datos "activos" reales fuera de la memoria.

En un sistema Linux, por ejemplo, puede usar el top comando y debería ver que:

  • bytes virtuales/VSIZE tenderá a ser el tamaño de toda la base de datos
  • si el servidor no tiene otros procesos en ejecución, los bytes residentes/RSIZE serán la memoria total de la máquina (esto incluye el contenido de la memoria caché del sistema de archivos)
  • mongod no debe usar intercambio (ya que los archivos están asignados a la memoria)

Puede usar el mongostat herramienta para obtener una vista rápida de su mongod actividad... o más útil, use un servicio como MMS para monitorear las métricas a lo largo del tiempo.

Optimizador de consultas

MongoDB Optimizador de consultas compara la ejecución del plan para un patrón de consulta cada ~1,000 operaciones de escritura y luego almacena en caché el plan de consulta "ganador" hasta la próxima vez que se ejecuta el optimizador... o usted llama explícitamente a un explain() en esa consulta.

Esto debería ser sencillo de probar:ejecute su consulta en mongo shell con .explain() y mire los tiempos de ms, y también la cantidad de entradas de índice y documentos escaneados. El tiempo para una explicación () no es el tiempo real que tardarán en ejecutarse las consultas, ya que incluye el costo de comparar los planes. La ejecución típica será mucho más rápida... y puede buscar consultas lentas en su mongod registro.

De forma predeterminada, MongoDB registrará todas las consultas a una velocidad inferior a 100 ms, por lo que proporciona un buen punto de partida para buscar consultas para optimizar. Puede ajustar el valor de ms lento con --slowms opción de configuración, o usando el Database Profiler comandos.

Lecturas adicionales en la documentación de MongoDB: