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
writeelevato 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
readelevato: 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
totalcostantemente 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,updateodelete: Indica un carico operativo pesante. Monitora queste metriche insieme ad altre per capire se il sistema sta tenendo il passo. connelevato: 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.networkInonetworkOutelevati: Suggerisce un significativo trasferimento di dati. Potrebbe essere dovuto a query grandi, traffico di replica o set di risultati di grandi dimensioni restituiti.reselevato: 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|qwelevati: 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
dirtyo cacheused: 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 dimongostatnon 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
- Esegui
mongostat: Osserva i tassi diqr,aw,insert,query,update,delete. Seqroawsono alti, o se i tassi di operazione sono alti ma non sembrano elaborarsi rapidamente, suggerisce un arretrato. - Esegui
mongotop: Identifica quali collezioni stanno subendo piùread msewrite ms. Una collezione con alta attività di scrittura potrebbe rallentare altre operazioni. - Controlla i piani di query: Per le collezioni calde identificate da
mongotop, eseguiexplain("executionStats")su query lente rappresentative. - Analizza
networkIn/networkOutinmongostat: Se sono insolitamente alti, cerca set di risultati grandi, aggregazioni grandi o traffico di replica.
Scenario 2: Utilizzo elevato di CPU o memoria
- Esegui
mongostat: Monitorares(memoria residente) e l'utilizzo della CPU (spesso osservabile tramite strumenti di sistema cometopohtop, mamongostatfornisce una prospettiva specifica del DB). Unreselevato potrebbe correlarsi con la cache di WiredTiger (used %). - Esamina
mongotop: Tempi elevati di read/write ms su collezioni specifiche possono contribuire a un uso elevato della CPU. - Guarda i tassi di operazione di
mongostat: Se inserimenti/aggiornamenti/cancellazioni sono estremamente alti, questo consuma naturalmente CPU. - 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.
- Esegui
mongostatsul primario: Cercaqroawelevati, 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. - Esegui
mongostatsul 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:
mongotopemongostatsono 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
connpossono 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.