Guida all'analisi delle metriche di performance di MongoDB con mongotop e mongostat

Utilizza mongotop e mongostat per individuare collezioni calde, pressione sulle risorse, picchi di connessione e pattern lenti di MongoDB.

Guida all'analisi delle metriche di performance di MongoDB con mongotop e mongostat

I problemi di performance di MongoDB spesso si manifestano come pagine lente, scritture in coda o improvvisi picchi di connessione. mongotop e mongostat, installati con MongoDB Database Tools, forniscono una rapida visualizzazione da terminale di ciò che il server sta facendo in tempo reale.

Questa guida mostra come interpretare questi strumenti durante gli incidenti più comuni, collegando poi l'output a possibili verifiche successive come indici, forma delle query, connection pooling e pressione sul disco.

Comprendere mongotop

mongotop fornisce una visione in tempo reale delle operazioni di lettura e scrittura in corso sulle tue istanze MongoDB. Mostra il tempo impiegato da ciascuna collezione in operazioni di lettura o scrittura in un intervallo specificato. Questo è particolarmente utile per identificare quali collezioni stanno subendo più attività e potrebbero essere una fonte di degrado delle performance.

Metriche chiave fornite da mongotop:

  • ns: Il namespace della collezione (database.collezione).
  • total: Tempo impiegato per leggere e scrivere nel namespace durante l'intervallo di campionamento.
  • read: Tempo impiegato per attività di lettura durante l'intervallo di campionamento.
  • write: Tempo impiegato per attività di scrittura durante l'intervallo di campionamento.

Come usare mongotop:

Puoi eseguire mongotop direttamente dal tuo terminale, a patto di avere gli strumenti del database MongoDB installati e accessibili nel tuo PATH. Di default, si aggiorna ogni secondo. Puoi anche specificare un intervallo in secondi.

mongotop

Per specificare un intervallo di aggiornamento (ad esempio, ogni 5 secondi):

mongotop 5

Per eseguire mongotop su un'istanza MongoDB in esecuzione su un host e porta diversi:

mongotop --host <hostname> --port <porta>

Interpretare l'output di mongotop:

  • Tempo di write elevato su una collezione specifica: La collezione sta subendo un'intensa attività di scrittura. Controlla il volume di scrittura, la crescita dei documenti, gli indici coinvolti nelle scritture e se il carico di lavoro dovrebbe essere partizionato (sharded).
  • Tempo di read elevato: Controlla i piani di query per quella collezione. Indici mancanti, set di risultati grandi e scansioni di aggregazione spesso si manifestano qui.
  • Collezioni con tempo total costantemente alto: Queste sono le tue collezioni più calde. Monitora attentamente i loro indici, il working set e i pattern di query.

Comprendere mongostat

mongostat fornisce una panoramica più ampia e in tempo reale delle performance e dell'utilizzo delle risorse di un'istanza MongoDB. Raccoglie e mostra una varietà di metriche sullo stato del server, incluse operazioni al secondo, traffico di rete, I/O del disco e utilizzo della memoria.

Metriche chiave fornite da mongostat:

  • insert: Operazioni al secondo per gli inserimenti.
  • query: Operazioni al secondo per le query.
  • update: Operazioni al secondo per gli aggiornamenti.
  • delete: Operazioni al secondo per le cancellazioni.
  • getmore: Operazioni al secondo per le operazioni getmore (usate per i cursori).
  • command: Operazioni al secondo per i comandi.
  • dirty o dirty %: Dati modificati nella cache di WiredTiger in memoria ma non ancora scritti su disco. Il nome esatto della colonna dipende dalla versione di MongoDB e degli strumenti.
  • used o used %: Utilizzo della cache di WiredTiger. Il nome esatto della colonna dipende dalla versione di MongoDB e degli strumenti.
  • conn: Numero corrente di connessioni.
  • networkIn: Traffico di rete ricevuto dal server (in byte).
  • networkOut: Traffico di rete inviato dal server (in byte).
  • res: Dimensione della memoria residente utilizzata dal processo MongoDB (in MB).
  • qr|qw: Numero di operazioni di lettura e scrittura in coda, quando la colonna è disponibile.
  • ar|aw: Numero di client attivi in lettura e scrittura, quando la colonna è disponibile.

Come usare mongostat:

mongostat è anche un'utilità da riga di comando. Simile a mongotop, si aggiorna periodicamente, con un intervallo predefinito di 5 secondi. Puoi specificare un intervallo diverso e i dettagli di connessione.

mongostat

Per specificare un intervallo di aggiornamento (ad esempio, ogni 2 secondi):

mongostat 2

Per connettersi a un'istanza MongoDB remota:

mongostat --host <hostname> --port <porta>

Interpretare l'output di mongostat:

  • Tassi elevati di insert, query, update o delete: Indica un carico operativo pesante. Monitora queste metriche insieme ad altre per capire se il sistema sta tenendo il passo.
  • conn elevato: Un numero elevato di connessioni può mettere a dura prova le risorse del server. Investiga il connection pooling nella tua applicazione se questo valore è inaspettatamente alto.
  • networkIn o networkOut elevati: Suggerisce un significativo trasferimento di dati. Potrebbe essere dovuto a query grandi, traffico di replica o set di risultati di grandi dimensioni restituiti.
  • res elevato: Il processo MongoDB sta consumando molta RAM. Assicurati che il tuo server abbia memoria sufficiente e verifica la presenza di query inefficienti o dataset di grandi dimensioni che potrebbero contribuire a un uso elevato della memoria.
  • qr|qw elevati: Indica che letture o scritture sono in coda, il che di solito indica contesa di risorse o un carico di lavoro che il server non riesce a elaborare abbastanza velocemente.
  • Valori elevati di dirty o cache used: Se la pressione sulla cache di WiredTiger rimane alta, il tuo working set potrebbe non entrare comodamente in memoria, oppure le scritture su disco potrebbero essere in ritardo.
  • Query lente con bassi tassi di operazioni: Usa il profiler, il log delle query lente o explain() per verificare se le query stanno scandendo troppi documenti. L'output moderno di mongostat non espone in modo affidabile una singola percentuale di mancato indice per le distribuzioni WiredTiger.

Casi d'uso pratici e scenari di risoluzione dei problemi

Scenario 1: Performance dell'applicazione lente

  1. Esegui mongostat: Osserva i tassi di qr, aw, insert, query, update, delete. Se qr o aw sono alti, o se i tassi di operazione sono alti ma non sembrano elaborarsi rapidamente, suggerisce un arretrato.
  2. Esegui mongotop: Identifica quali collezioni stanno subendo più read ms e write ms. Una collezione con alta attività di scrittura potrebbe rallentare altre operazioni.
  3. Controlla i piani di query: Per le collezioni calde identificate da mongotop, esegui explain("executionStats") su query lente rappresentative.
  4. Analizza networkIn/networkOut in mongostat: Se sono insolitamente alti, cerca set di risultati grandi, aggregazioni grandi o traffico di replica.

Scenario 2: Utilizzo elevato di CPU o memoria

  1. Esegui mongostat: Monitora res (memoria residente) e l'utilizzo della CPU (spesso osservabile tramite strumenti di sistema come top o htop, ma mongostat fornisce una prospettiva specifica del DB). Un res elevato potrebbe correlarsi con la cache di WiredTiger (used %).
  2. Esamina mongotop: Tempi elevati di read/write ms su collezioni specifiche possono contribuire a un uso elevato della CPU.
  3. Guarda i tassi di operazione di mongostat: Se inserimenti/aggiornamenti/cancellazioni sono estremamente alti, questo consuma naturalmente CPU.
  4. Investiga la cache di WiredTiger e le metriche del disco: Se la cache dirty rimane alta mentre le scritture dell'applicazione rallentano, confronta l'output di MongoDB con la latenza del disco dell'host e la saturazione I/O.

Scenario 3: Ritardo di replica

Sebbene mongotop e mongostat non misurino direttamente il ritardo di replica, sono cruciali per comprendere la causa del ritardo.

  1. Esegui mongostat sul primario: Cerca qr o aw elevati, tassi elevati di operazioni di scrittura o uso elevato di CPU/memoria. Se il primario è sovraccarico, non può scrivere efficientemente nel suo oplog, portando a ritardo sui secondari.
  2. Esegui mongostat sul secondario: Osserva le sue operazioni di lettura/scrittura. Se il secondario è lento nell'applicare le voci dell'oplog, potrebbe essere dovuto a risorse insufficienti sul secondario o a query/operazioni inefficienti applicate.

Suggerimenti e buone pratiche

  • Esegui gli strumenti regolarmente: Non aspettare che sorgano problemi di performance. Monitora proattivamente le tue istanze MongoDB.
  • Stabilisci delle baseline: Comprendi come appare la "normalità" per la tua distribuzione. Questo rende più facile individuare le deviazioni.
  • Combina con altri strumenti: mongotop e mongostat sono eccellenti per istantanee in tempo reale. Per analisi storiche, considera l'uso del monitoraggio delle performance integrato di MongoDB (ad esempio, db.serverStatus(), db.stats()) o strumenti esterni come Prometheus con MongoDB Exporter, o i servizi di monitoraggio del provider cloud.
  • Comprendi il tuo working set: Conoscere la dimensione del tuo set di dati attivo è cruciale per la gestione della memoria e per comprendere l'efficacia della cache di WiredTiger.
  • Concentrati sui piani di query: Usa explain("executionStats") e il log delle query lente per confermare se indici mancanti o inefficienti stanno causando scansioni.
  • Considera il connection pooling: Conteggi elevati di conn possono spesso essere mitigati implementando un corretto connection pooling nel livello applicativo.

Concetti chiave

Usa mongostat per comprendere la pressione a livello di server e mongotop per trovare le collezioni che ricevono più attenzione in lettura o scrittura. Quando uno dei due strumenti indica un'area calda, conferma la causa con piani di query, log delle query lente, metriche dell'host e comportamento delle connessioni dell'applicazione prima di modificare gli indici o scalare la distribuzione.