performance - sistemas - mongodb wikipedia
MongoDB precarga los documentos en la RAM para un mejor rendimiento (1)
El problema de rendimiento observado en una consulta inicial es uno de los siguientes (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) Query Optimizer puede tardar un poco más en ejecutarse en la primera solicitud, ya que compara 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 aislar si la sobrecarga está relacionada con MongoDB o su servicio web (en lugar de sincronizar ambos, como lo ha hecho).
Las siguientes son algunas notas relacionadas con MongoDB.
Almacenamiento en caché
MongoDB no tiene un tiempo de "almacenamiento en caché" para documentos en memoria. Utiliza archivos mapeados en memoria para E / S de disco y los documentos en la memoria se basan en sus consultas activas (documentos / índices que ha cargado 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 Mínimo uso reciente (LRU) para decidir qué páginas se eliminarán 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.
Al db.stats()
números provistos de db.stats()
(y suponiendo que es su única base de datos), parece que el tamaño de su base de datos es actual de 1Gb, por lo que debería poder mantener todo dentro de su RAM total de 10Gb a menos que:
- hay otros procesos que compiten por la memoria
- reinició su servidor
mongod
y esos documentos / índices aún no han sido solicitados
En MongoDB 2.2, hay un nuevo comando touch
que puede usar para cargar índices o documentos en la memoria después de reiniciar el servidor. Esto solo se debe utilizar en el inicio inicial para "calentar" el servidor, ya que de lo contrario podría estar forzando a los datos reales "activos" a salir de la memoria.
En un sistema Linux, por ejemplo, puede usar el comando top
y debería ver que:
- los bytes virtuales / VSIZE tenderán a ser del tamaño de la base de datos completa
- 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 debería usar swap (ya que los archivos están mapeados en la memoria)
Puede usar la herramienta mongostat
para obtener una vista rápida de su actividad de mongod
... o más útilmente, use un servicio como MMS para monitorear las métricas a lo largo del tiempo.
Query Optimizer
El MongoDB Query Optimizer 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 explícitamente llama a explain()
en esa consulta.
Esto debería ser sencillo de probar: ejecute su consulta en el shell de mongo
con .explain()
y observe los tiempos de ms, y también el número de entradas de índice y documentos escaneados. El tiempo para una explicación () no es el tiempo real que tomarán las consultas para ejecutarse, 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 registro mongod
.
De forma predeterminada, MongoDB registrará todas las consultas más lentas de 100 ms, por lo que ofrece un buen punto de partida para buscar consultas para optimizar. Puede ajustar el valor ms lento con la --slowms
config, o usar los comandos Database Profiler
.
Lectura adicional en la documentación de MongoDB:
Quiero que MongoDB mantenga los resultados de la consulta en la RAM durante un período de tiempo más largo (por ejemplo, 30 minutos si la memoria está disponible). ¿Es posible? O, ¿hay alguna manera de asegurarme de que los datos estén precargados en la memoria RAM antes de las consultas posteriores en ella?
De hecho, me estoy preguntando sobre el rendimiento simple de los resultados de búsqueda de MongoDB. Tengo un servidor dedicado con 10 GB de RAM y mis db.stats () son los siguientes;
db.stats();
{
"db": "test",
"collections":16,
"objects":625690,
"avgObjSize":68.90,
"dataSize":43061996,
"storageSize":1121402888,
"numExtents":74,
"indexes":25,
"indexSize":28207200,
"fileSize":469762048,
"nsSizeMB":16,
"ok":1
}
Ahora cuando consulto un documento único ( como se menciona aquí ) desde un servicio web, se carga en 1.3 segundos. Las llamadas posteriores a las mismas consultas dan una respuesta en 400 ms y luego, después de algunos segundos, nuevamente comienzan a tomar 1.3 segundos. Parece que MongoDB ha perdido el documento consultado previamente de la memoria, donde no hay otras consultas que soliciten datos asignados a la memoria RAM.
Explique esto y hágame saber cualquier forma de hacer que las consultas posteriores respondan con mayor rapidez.