MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Correzione degli errori di pagina in MongoDB

Gli errori di pagina sono un errore prevalente che si verifica principalmente in un'applicazione di grandi dimensioni che include dati di grandi dimensioni. Si verifica quando il database MongoDB legge i dati dalla memoria fisica anziché dalla memoria virtuale. Gli errori di errore di pagina si verificano nel momento in cui MongoDB desidera ottenere dati che non sono disponibili nella memoria attiva del database, quindi costretto a leggere dal disco. Ciò crea una grande latenza per le operazioni di throughput, facendo sembrare che le query siano in ritardo.

La regolazione delle prestazioni di MongoDB mediante l'ottimizzazione è un componente vitale che ottimizza l'esecuzione di un'applicazione. I database sono migliorati per funzionare con le informazioni conservate sul disco, tuttavia normalmente memorizzano nella cache grandi quantità di dati nella RAM nel tentativo di accedere al disco. È costoso archiviare e accedere ai dati dal database, pertanto le informazioni devono essere prima archiviate nel disco prima di consentire alle applicazioni di accedervi. A causa del fatto che i dischi sono più lenti rispetto alla cache dei dati RAM, il processo richiede una notevole quantità di tempo. Pertanto, MongoDB è progettato per segnalare il verificarsi di errori di pagina come riepilogo di tutti gli incidenti in un secondo

La topologia dello spostamento dei dati in MongoDB

I dati dal client vengono spostati nella memoria virtuale dove la cache della pagina li legge mentre viene scritta, i dati vengono quindi archiviati nel disco come mostrato nel diagramma seguente.

Come trovare gli errori di pagina di MongoDB

Gli errori di pagina possono essere rilevati tramite il blocco delle prestazioni che garantiscono la coerenza dei dati in MongoDB. Quando una determinata operazione è in coda o viene eseguita per molto tempo, le prestazioni di MongoDB diminuiscono e l'operazione rallenta in attesa del blocco. Ciò comporta un rallentamento poiché i ritardi relativi al blocco sono sporadici e talvolta influiscono sulle prestazioni dell'applicazione. Il blocco influenza le prestazioni di un'applicazione quando i blocchi sono divisi (locks.timeAcquiringMicros by locks.acquireWaitCount), questo fornisce il tempo medio di attesa per una determinata modalità di blocco. Locks.deadLockCount fornisce il totale di tutte le acquisizioni di blocco verificate. Dato che globalLock.totalTime è armoniosamente alto, ci sono numerose richieste in attesa di un blocco. Man mano che più richieste attendono il blocco, viene consumata più RAM e questo porta alla pagina Errori.

Puoi anche usare mem.mapped che consente agli sviluppatori di esaminare la memoria totale utilizzata da mongod. Mem.mapped è un operatore server per il controllo della quantità di memoria in megabyte (MB) in un motore di archiviazione MMAPv1. Se l'operatore mem.mapped mostra un valore maggiore della quantità totale di memoria di sistema, si verificherà un errore di pagina perché una quantità così grande di utilizzo della memoria porterà a un errore di pagina nel database.

Come si verificano gli errori di pagina in MongoDB

Il caricamento delle pagine in MongoDB dipende dalla disponibilità di memoria libera, nel caso in cui manchi di memoria libera il sistema operativo deve:

  1. Cerca una pagina che il database ha smesso di utilizzare e scrivi la pagina sul disco di memoria.
  2. Carica la pagina richiesta in memoria dopo averla letta dal disco.

Queste due attività si svolgono durante il caricamento delle pagine e quindi consumano molto tempo rispetto alla lettura in una memoria attiva che porta al verificarsi di errori di pagina.

Risoluzione degli errori di pagina di MongoDB

Di seguito sono riportati alcuni modi per risolvere gli errori di pagina: 

  1. Ridimensionamento verticale su dispositivi con RAM sufficiente o ridimensionamento orizzontale: quando non c'è RAM sufficiente per un determinato set di dati, l'approccio corretto consiste nell'aumentare la memoria RAM ridimensionando verticalmente su dispositivi con più RAM in modo da aggiungere più risorse al server. Il ridimensionamento verticale è uno dei modi migliori e semplici per aumentare le prestazioni di MongoDB non distribuendo il carico tra più server. Poiché il ridimensionamento verticale aggiunge più RAM, il ridimensionamento orizzontale consente l'aggiunta di più shard a un cluster partizionato. In termini semplici, il ridimensionamento orizzontale è il punto in cui il database è diviso in vari blocchi e archiviato in più server. Il ridimensionamento orizzontale consente allo sviluppatore di aggiungere più server al volo e questo aumenta notevolmente le prestazioni del database poiché non comporta quindi tempi di inattività pari a zero. Il ridimensionamento verticale e il ridimensionamento orizzontale riducono l'occorrenza di risoluzione degli errori di pagina aumentando la memoria che si lavora mentre si lavora con il database.
  2. Indicizzare correttamente i dati: utilizzo di indici appropriati in modo da garantire che ci siano query efficienti che non causino scansioni di raccolta. L'indicizzazione corretta garantisce che il database non esegua l'iterazione su ogni documento in una raccolta, risolvendo così il possibile verificarsi di errori di pagina. La scansione della raccolta provoca un errore di errore di pagina perché l'intera raccolta viene esaminata dal motore di query mentre viene letta nella RAM. La maggior parte dei documenti nella scansione della raccolta non viene restituita nell'app e quindi causa errori di pagina non necessari per ogni query successiva che non è facile eludere. Inoltre, gli indici in eccesso possono anche portare a un uso inefficiente della RAM, il che può portare a errori di pagina. Pertanto, una corretta indicizzazione è fondamentale se uno sviluppatore intende risolvere gli errori di errore di pagina. MongoDB offre assistenza nella determinazione degli indici da distribuire quando si utilizza il database. Offrono sia Slow Query Analyzer che forniscono le informazioni necessarie su come indicizzare per gli utenti e gli utenti condivisi.
  3. Migrazione all'ultima versione di MongoDB, quindi spostamento dell'applicazione su WiredTiger. Ciò è necessario se si intende evitare di riscontrare un errore di errore di pagina poiché gli errori di pagina sono comuni solo nei motori di archiviazione MMAPv1 rispetto alle versioni più recenti e WiredTiger. Il motore di archiviazione MMAPv1 è stato deprecato e MongoDB non lo supporta più. WiredTiger è l'attuale motore di archiviazione predefinito in MongoDB e dispone di MultiVersion Concurrency Control che lo rende molto migliore rispetto al motore di archiviazione MMAPv1. Con WiredTiger MongoDB può utilizzare sia la cache del filesystem che la cache interna di WiredTiger che ha una dimensione molto grande di 1 GB (50% 0f (RAM - 1 GB)) o 256 MB.
  4. Tieni traccia della RAM totale disponibile per l'uso nel tuo sistema. Questo può essere fatto utilizzando servizi come il monitoraggio di New Relic Google Cloud Monitoring. Inoltre, BindPlane può essere utilizzato con i servizi di monitoraggio cloud menzionati. L'utilizzo di un sistema di monitoraggio è una misura proattiva che consente di contrastare gli errori di pagina prima che si verifichino anziché reagire agli errori di pagina che si verificano. BindPlane consente al monitor di impostare avvisi costanti per il verificarsi di errori di pagina, gli avvisi informano anche del numero di indici, della dimensione dell'indice e della dimensione del file.
  5. Assicurarsi che i dati siano configurati nel working set prevalente e non utilizzino più RAM di quella consigliata. MongoDB è un sistema di database che funziona al meglio quando i dati e gli indici a cui si accede di frequente possono adattarsi perfettamente alla memoria assegnata. La dimensione della RAM è un aspetto fondamentale quando si ottimizzano le prestazioni del database, quindi è necessario assicurarsi che sia sempre disponibile memoria RAM sufficiente prima di distribuire l'app.
  6. Distribuzione del carico tra istanze mongod aggiungendo shard o distribuendo un cluster sharded. È di vitale importanza consentire l'ombreggiatura nel punto in cui si trova la raccolta mirata. Innanzitutto, connettiti a mongos nella mongo shell e utilizza il metodo seguente.
    1. sh.shardCollection()

      Quindi creare un indice con questo metodo.

      ​db.collection.createIndex(keys, options)
      L'indice creato supporta la chiave shard, ovvero se la raccolta creata aveva già ricevuto o memorizzato alcuni dati. Tuttavia, se la raccolta non contiene dati (vuoti), utilizza il metodo seguente per indicizzarla come parte di ssh.shardCollection: sh.shardCollection()
    2. Questo è seguito da una delle due strategie fornite da mongoDB.
      1. Ombreggiatura hash 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Ombreggiatura basata sull'intervallo 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Come prevenire gli errori di pagina di MongoDB

  1. Aggiungi shard o distribuisci cluster shard per distribuire il carico
  2. Disponi di RAM sufficiente per la tua applicazione prima di distribuirla
  3. Sposta su MongoDB versioni più recenti, quindi passa a WiredTiger
  4. Ridimensiona verticalmente o orizzontalmente per un dispositivo con più RAM 
  5. Utilizza la RAM consigliata e tieni traccia dello spazio RAM utilizzato

Conclusione 

Alcuni errori di pagina (da soli) richiedono poco tempo, tuttavia, in una situazione in cui sono presenti numerosi errori di pagina (aggregati), è un'indicazione che il database sta leggendo un gran numero di dati in il disco. Quando si verifica l'aggregazione, ci saranno più blocchi di lettura MongoBD che porteranno a un errore di pagina.

Quando si utilizza MongoDB, la dimensione della RAM per il sistema e il numero di query possono influenzare notevolmente le prestazioni dell'applicazione. Le prestazioni di un'applicazione in MongoDB dipendono molto dalla RAM disponibile sulla memoria fisica, il che influisce sul tempo impiegato dall'applicazione per eseguire una singola query. Con una RAM sufficiente il verificarsi di errori di pagina è ridotto e le prestazioni dell'applicazione sono migliorate.