Guía para analizar métricas de rendimiento de MongoDB con mongotop y mongostat
Usa mongotop y mongostat para detectar colecciones activas, presión de recursos, picos de conexiones y patrones lentos en MongoDB.
Guía para analizar métricas de rendimiento de MongoDB con mongotop y mongostat
Los problemas de rendimiento de MongoDB a menudo se manifiestan como páginas lentas, escrituras acumuladas o picos repentinos de conexiones. mongotop y mongostat, instalados con MongoDB Database Tools, te ofrecen una vista rápida en terminal de lo que el servidor está haciendo en ese momento.
Esta guía muestra cómo interpretar esas herramientas durante incidentes comunes y luego conectar la salida con posibles siguientes verificaciones, como índices, forma de las consultas, pooling de conexiones y presión de disco.
Entendiendo mongotop
mongotop proporciona una vista en tiempo real de las operaciones de lectura y escritura que ocurren en tus instancias de MongoDB. Muestra el tiempo dedicado por cada colección en operaciones de lectura o escritura durante un intervalo especificado. Esto es particularmente útil para identificar qué colecciones están experimentando más actividad y podrían ser una fuente de degradación del rendimiento.
Métricas clave proporcionadas por mongotop:
- ns: El espacio de nombres de la colección (base_de_datos.colección).
- total: Tiempo dedicado a leer y escribir en el espacio de nombres durante el intervalo de muestra.
- read: Tiempo dedicado a actividad de lectura durante el intervalo de muestra.
- write: Tiempo dedicado a actividad de escritura durante el intervalo de muestra.
Cómo usar mongotop:
Puedes ejecutar mongotop directamente desde tu terminal, siempre que tengas las herramientas de base de datos de MongoDB instaladas y accesibles en tu PATH. Por defecto, se actualiza cada segundo. También puedes especificar un intervalo en segundos.
mongotop
Para especificar un intervalo de actualización (por ejemplo, cada 5 segundos):
mongotop 5
Para ejecutar mongotop contra una instancia de MongoDB que se ejecuta en un host y puerto diferentes:
mongotop --host <nombre_del_host> --port <puerto>
Interpretando la salida de mongotop:
- Alto tiempo de
writeen una colección específica: La colección está viendo una actividad intensa de escritura. Verifica el volumen de escritura, el crecimiento de documentos, los índices afectados por las escrituras y si la carga de trabajo debería estar fragmentada. - Alto tiempo de
read: Revisa los planes de consulta para esa colección. Los índices faltantes, los conjuntos de resultados grandes y los escaneos de agregación a menudo aparecen aquí. - Colecciones con tiempo
totalconsistentemente alto: Estas son tus colecciones más activas. Monitorea de cerca sus índices, conjunto de trabajo y patrones de consulta.
Entendiendo mongostat
mongostat proporciona una visión general más amplia y en tiempo real del rendimiento y la utilización de recursos de una instancia de MongoDB. Recopila y muestra una variedad de métricas sobre el estado del servidor, incluyendo operaciones por segundo, tráfico de red, E/S de disco y uso de memoria.
Métricas clave proporcionadas por mongostat:
- insert: Operaciones por segundo para inserciones.
- query: Operaciones por segundo para consultas.
- update: Operaciones por segundo para actualizaciones.
- delete: Operaciones por segundo para eliminaciones.
- getmore: Operaciones por segundo para operaciones getmore (usadas para cursores).
- command: Operaciones por segundo para comandos.
- dirty o dirty %: Datos modificados en la caché de WiredTiger en memoria pero aún no escritos en disco. El nombre exacto de la columna depende de la versión de MongoDB y de la herramienta.
- used o used %: Uso de la caché de WiredTiger. El nombre exacto de la columna depende de la versión de MongoDB y de la herramienta.
- conn: Número actual de conexiones.
- networkIn: Tráfico de red recibido por el servidor (en bytes).
- networkOut: Tráfico de red enviado por el servidor (en bytes).
- res: Tamaño de memoria residente utilizado por el proceso de MongoDB (en MB).
- qr|qw: Número de operaciones de lectura y escritura en cola, cuando la columna está disponible.
- ar|aw: Número de clientes activos de lectura y escritura, cuando la columna está disponible.
Cómo usar mongostat:
mongostat también es una utilidad de línea de comandos. Similar a mongotop, se actualiza periódicamente, con un intervalo predeterminado de 5 segundos. Puedes especificar un intervalo diferente y detalles de conexión.
mongostat
Para especificar un intervalo de actualización (por ejemplo, cada 2 segundos):
mongostat 2
Para conectarse a una instancia remota de MongoDB:
mongostat --host <nombre_del_host> --port <puerto>
Interpretando la salida de mongostat:
- Altas tasas de
insert,query,updateodelete: Indica una carga operativa intensa. Monitorea estas junto con otras métricas para entender si el sistema está al día. - Alto
conn: Un gran número de conexiones puede sobrecargar los recursos del servidor. Investiga el pooling de conexiones en tu aplicación si esto es inesperadamente alto. - Alto
networkInonetworkOut: Sugiere una transferencia de datos significativa. Esto podría deberse a consultas grandes, tráfico de replicación o conjuntos de resultados grandes que se devuelven. - Alto
res: El proceso de MongoDB está consumiendo mucha RAM. Asegúrate de que tu servidor tenga suficiente memoria y verifica si hay consultas ineficientes o conjuntos de datos grandes que puedan contribuir al alto uso de memoria. - Alto
qr|qw: Indica que las lecturas o escrituras están en cola, lo que generalmente apunta a contención de recursos o una carga de trabajo que el servidor no puede procesar lo suficientemente rápido. - Altos valores de
dirtyo cachéused: Si la presión de la caché de WiredTiger se mantiene alta, tu conjunto de trabajo podría no caber cómodamente en memoria, o las escrituras en disco podrían estar retrasadas. - Consultas lentas con bajas tasas de operación: Usa el generador de perfiles, el registro de consultas lentas o
explain()para verificar si las consultas están escaneando demasiados documentos. La salida moderna demongostatno expone de manera confiable un solo porcentaje de fallos de índice para implementaciones de WiredTiger.
Casos de uso prácticos y escenarios de solución de problemas
Escenario 1: Rendimiento lento de la aplicación
- Ejecuta
mongostat: Observa las tasas deqr,aw,insert,query,update,delete. Siqroawson altos, o si las tasas de operación son altas pero no parecen procesarse rápidamente, sugiere un trabajo acumulado. - Ejecuta
mongotop: Identifica qué colecciones están experimentando másread msywrite ms. Una colección con alta actividad de escritura podría estar ralentizando otras operaciones. - Revisa los planes de consulta: Para las colecciones activas identificadas por
mongotop, ejecutaexplain("executionStats")en consultas lentas representativas. - Analiza
networkIn/networkOutenmongostat: Si son inusualmente altos, busca conjuntos de resultados grandes, agregaciones grandes o tráfico de replicación.
Escenario 2: Alto uso de CPU o memoria
- Ejecuta
mongostat: Monitoreares(memoria residente) y el uso de CPU (a menudo observable a través de herramientas del sistema comotopohtop, peromongostatproporciona una perspectiva específica de la base de datos). Unresalto podría correlacionarse con la caché de WiredTiger (used %). - Examina
mongotop: Altos ms de lectura/escritura en colecciones específicas pueden contribuir al alto uso de CPU. - Observa las tasas de operación de
mongostat: Si las inserciones/actualizaciones/eliminaciones son extremadamente altas, esto consume CPU de forma natural. - Investiga la caché de WiredTiger y las métricas de disco: Si la caché sucia se mantiene alta mientras las escrituras de la aplicación se ralentizan, compara la salida de MongoDB con la latencia del disco del host y la saturación de E/S.
Escenario 3: Retraso de replicación
Aunque mongotop y mongostat no miden directamente el retraso de replicación, son cruciales para entender la causa del retraso.
- Ejecuta
mongostaten el primario: Buscaqroawaltos, altas tasas de operaciones de escritura o alto uso de CPU/memoria. Si el primario está sobrecargado, no puede escribir eficientemente en su oplog, lo que lleva a retraso en los secundarios. - Ejecuta
mongostaten el secundario: Observa sus operaciones de lectura/escritura. Si el secundario es lento para aplicar las entradas del oplog, podría deberse a recursos insuficientes en el secundario o consultas/operaciones ineficientes que se están aplicando.
Consejos y mejores prácticas
- Ejecuta las herramientas regularmente: No esperes a que surjan problemas de rendimiento. Monitorea tus instancias de MongoDB de manera proactiva.
- Establece líneas base: Entiende cómo se ve "normal" para tu implementación. Esto facilita detectar desviaciones.
- Combina con otras herramientas:
mongotopymongostatson excelentes para instantáneas en tiempo real. Para análisis históricos, considera usar el monitoreo de rendimiento integrado de MongoDB (por ejemplo,db.serverStatus(),db.stats()) o herramientas externas como Prometheus con el MongoDB Exporter, o servicios de monitoreo del proveedor de la nube. - Entiende tu conjunto de trabajo: Conocer el tamaño de tu conjunto de datos activos es crucial para la gestión de la memoria y entender la efectividad de la caché de WiredTiger.
- Concéntrate en los planes de consulta: Usa
explain("executionStats")y el registro de consultas lentas para confirmar si los índices faltantes o ineficientes están causando escaneos. - Considera el pooling de conexiones: Los recuentos altos de
conna menudo pueden mitigarse implementando un pooling de conexiones adecuado en tu capa de aplicación.
Conclusión
Usa mongostat para entender la presión a nivel de servidor y mongotop para encontrar las colecciones que reciben más atención de lectura o escritura. Cuando cualquiera de las herramientas apunte a un área activa, confirma la causa con planes de consulta, registros de consultas lentas, métricas del host y el comportamiento de conexión de la aplicación antes de cambiar índices o escalar la implementación.