MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Seitenfehler in MongoDB beheben

Seitenfehler sind ein häufiger Fehler, der meistens in einer großen Anwendung mit großen Datenmengen auftritt. Es findet statt, wenn die MongoDB-Datenbank Daten aus dem physischen Speicher und nicht aus dem virtuellen Speicher liest. Seitenfehler treten in dem Moment auf, in dem MongoDB Daten abrufen möchte, die nicht im aktiven Speicher der Datenbank verfügbar sind und daher gezwungen sind, von der Festplatte zu lesen. Dadurch entsteht eine große Latenz für Durchsatzvorgänge, wodurch Abfragen so aussehen, als würden sie verzögert.

Das Anpassen der Leistung von MongoDB durch Tuning ist eine wichtige Komponente, die die Ausführung einer Anwendung optimiert. Datenbanken werden verbessert, um mit Informationen zu arbeiten, die auf der Festplatte gespeichert sind, sie speichern jedoch gewöhnlich große Datenmengen im RAM, um zu versuchen, auf die Festplatte zuzugreifen. Es ist teuer, Daten in der Datenbank zu speichern und darauf zuzugreifen, daher müssen die Informationen zuerst auf der Festplatte gespeichert werden, bevor Anwendungen darauf zugreifen können. Aufgrund der Tatsache, dass Festplatten im Vergleich zum RAM-Datencache langsamer sind, nimmt der Prozess folglich viel Zeit in Anspruch. Daher ist MongoDB darauf ausgelegt, das Auftreten von Seitenfehlern als Zusammenfassung aller Vorfälle in einer Sekunde zu melden

Die Datenbewegungstopologie in MongoDB

Daten vom Client werden in den virtuellen Speicher verschoben, wo sie vom Seitencache gelesen werden, während sie geschrieben werden. Die Daten werden dann auf der Festplatte gespeichert, wie im folgenden Diagramm dargestellt.

So finden Sie MongoDB-Seitenfehler

Seitenfehler können durch die Sperrleistung erkannt werden, die die Datenkonsistenz in MongoDB gewährleistet. Wenn ein bestimmter Vorgang lange in die Warteschlange gestellt oder ausgeführt wird, verschlechtert sich die Leistung von MongoDB und der Vorgang verlangsamt sich, während er auf eine Sperre wartet. Dies führt zu einer Verlangsamung, da Verzögerungen im Zusammenhang mit Sperren sporadisch auftreten und manchmal die Leistung der Anwendung beeinträchtigen. Sperren beeinflusst die Leistung einer Anwendung, wenn Sperren geteilt werden (locks.timeAcquiringMicros durch locks.acquireWaitCount), dies gibt die durchschnittliche Wartezeit für einen bestimmten Sperrmodus an. Locks.deadLockCount gibt die Gesamtzahl aller Sperrakquisitionen an, die erlebt wurden. Da globalLock.totalTime harmonisch hoch ist, gibt es zahlreiche Anfragen, die eine Sperre erwarten. Je mehr Anforderungen auf die Sperre warten, desto mehr RAM wird verbraucht, und dies führt zu Seitenfehlern.

Sie können auch mem.mapped verwenden, was es Entwicklern ermöglicht, den Gesamtspeicher zu untersuchen, den Mongod verwendet. Mem.mapped ist ein Serveroperator zum Überprüfen der Speichermenge in Megabyte (MB) in einer MMAPv1-Speicher-Engine. Wenn der mem.mapped-Operator einen Wert größer als die Gesamtmenge des Systemspeichers anzeigt, führt dies zu einem Seitenfehler, da eine so große Speichernutzung zu einem Seitenfehler in der Datenbank führt.

Wie Seitenfehler in MongoDB auftreten

Das Laden von Seiten in MongoDB hängt von der Verfügbarkeit von freiem Speicher ab, falls es an freiem Speicher mangelt, muss das Betriebssystem:

  1. Suchen Sie nach einer Seite, die die Datenbank nicht mehr verwendet, und schreiben Sie die Seite auf die Speicherplatte.
  2. Laden Sie die angeforderte Seite in den Speicher, nachdem Sie sie von der Festplatte gelesen haben.

Diese beiden Aktivitäten finden statt, wenn Seiten geladen werden, und nehmen daher im Vergleich zum Lesen in einem aktiven Speicher viel Zeit in Anspruch, was zum Auftreten von Seitenfehlern führt.

MongoDB-Seitenfehler beheben

Im Folgenden finden Sie einige Möglichkeiten, wie Sie Seitenfehler beheben können: 

  1. Vertikale Skalierung auf Geräte mit ausreichend RAM oder horizontale Skalierung:Wenn für einen bestimmten Datensatz nicht genügend RAM vorhanden ist, besteht der richtige Ansatz darin, den RAM-Speicher zu erhöhen, indem vertikal auf Geräte mit mehr RAM skaliert wird, um dem Server mehr Ressourcen hinzuzufügen. Die vertikale Skalierung ist eine der besten und mühelosesten Möglichkeiten, die Leistung von MongoDB zu steigern, indem die Last nicht auf mehrere Server verteilt wird. Da durch vertikales Skalieren mehr RAM hinzugefügt wird, ermöglicht horizontales Skalieren das Hinzufügen von mehr Shards zu einem Sharding-Cluster. Einfach ausgedrückt bedeutet die horizontale Skalierung, dass die Datenbank in verschiedene Blöcke aufgeteilt und auf mehreren Servern gespeichert wird. Die horizontale Skalierung ermöglicht es dem Entwickler, weitere Server im Handumdrehen hinzuzufügen, was die Datenbankleistung erheblich steigert, da es somit nicht zu Null-Ausfallzeiten kommt. Vertikales Skalieren und horizontales Skalieren reduziert das Auftreten von Seitenfehlern, indem der Arbeitsspeicher erhöht wird, der beim Arbeiten mit der Datenbank verwendet wird.
  2. Daten ordnungsgemäß indizieren: Verwendung geeigneter Indizes, um sicherzustellen, dass es effiziente Abfragen gibt, die keine Erfassungsscans verursachen. Eine ordnungsgemäße Indizierung stellt sicher, dass die Datenbank nicht jedes Dokument in einer Sammlung durchläuft, und löst somit das mögliche Auftreten von Seitenfehlerfehlern. Der Sammlungsscan verursacht einen Seitenfehlerfehler, da die gesamte Sammlung von der Abfrage-Engine überprüft wird, während sie in den Arbeitsspeicher eingelesen wird. Die meisten Dokumente im Sammlungsscan werden nicht in der App zurückgegeben und verursachen somit unnötige Seitenfehler bei jeder nachfolgenden Abfrage, die nicht einfach zu umgehen sind. Darüber hinaus können überschüssige Indizes auch zu einer ineffizienten Nutzung des RAM führen, was zu einem Seitenfehler führen kann. Daher ist eine ordnungsgemäße Indexierung von größter Bedeutung, wenn ein Entwickler beabsichtigt, Seitenfehlerfehler zu beheben. MongoDB bietet Unterstützung bei der Bestimmung der Indizes, die bei der Verwendung der Datenbank bereitgestellt werden sollten. Sie bieten sowohl Slow Query Analyzer an, die die erforderlichen Informationen zum Indizieren für Benutzer als auch für gemeinsam genutzte Benutzer liefern.
  3. Migration auf die neueste Version von MongoDB und anschließendes Verschieben der Anwendung auf WiredTiger. Dies ist erforderlich, wenn Sie vermeiden möchten, dass Seitenfehler auftreten, da Seitenfehler nur in MMAPv1-Speicher-Engines üblich sind, im Gegensatz zu neueren Versionen und WiredTiger. Die MMAPv1-Speicher-Engine ist veraltet und wird von MongoDB nicht mehr unterstützt. WiredTiger ist die aktuelle Standardspeicher-Engine in MongoDB und verfügt über MultiVersion Concurrency Control, wodurch es im Vergleich zur MMAPv1-Speicher-Engine viel besser ist. Mit WiredTiger kann MongoDB sowohl den Dateisystem-Cache als auch den internen WiredTiger-Cache verwenden, der eine sehr große Größe von entweder 1 GB (50 % 0f (RAM – 1 GB)) oder 256 MB hat.
  4. Verfolgen Sie den gesamten verfügbaren Arbeitsspeicher Ihres Systems. Dies kann durch die Verwendung von Diensten wie New Relic Monitoring Google Cloud Monitoring erfolgen. Darüber hinaus kann BindPlane mit den erwähnten Cloud-Überwachungsdiensten verwendet werden. Die Verwendung eines Überwachungssystems ist eine proaktive Maßnahme, die es ermöglicht, Seitenfehlern entgegenzuwirken, bevor sie auftreten, anstatt auf auftretende Seitenfehler zu reagieren. BindPlane ermöglicht es dem Monitor, konstante Warnungen für das Auftreten von Seitenfehlern einzurichten, die Warnungen machen auch auf die Anzahl der Indizes, die Indexgröße und die Dateigröße aufmerksam.
  5. Sicherstellen, dass die Daten im vorherrschenden Arbeitssatz konfiguriert sind und nicht mehr RAM als empfohlen verwenden. MongoDB ist ein Datenbanksystem, das am besten funktioniert, wenn häufig aufgerufene Daten und Indizes perfekt in den zugewiesenen Speicher passen. Die RAM-Größe ist ein entscheidender Aspekt bei der Optimierung der Leistung der Datenbank. Daher muss sichergestellt werden, dass immer genügend RAM-Speicher vorhanden ist, bevor die App bereitgestellt wird.
  6. Verteilen der Last zwischen Mongod-Instanzen durch Hinzufügen von Shards oder Bereitstellen eines Sharding-Clusters. Es ist von entscheidender Bedeutung, die Beschattung dort zu ermöglichen, wo sich die Zielsammlung befindet. Stellen Sie zuerst eine Verbindung zu Mongos in der Mongo-Shell her und verwenden Sie die folgende Methode.
    1. sh.shardCollection()

      Erstellen Sie dann mit dieser Methode einen Index.

      ​db.collection.createIndex(keys, options)
      Der erstellte Index unterstützt den Shard-Schlüssel, d. h. wenn die erstellte Sammlung bereits einige Daten empfangen oder gespeichert hat. Wenn die Sammlung jedoch keine Daten enthält (leer), verwenden Sie die folgende Methode, um sie als Teil der ssh.shardCollection zu indizieren: sh.shardCollection()
    2. Darauf folgt eine der beiden von mongoDB bereitgestellten Strategien.
      1. Hash-Schattierung 
        sh.shardCollection("<database>.<collection>", { <shard key field> : "hashed" } )
      2. Bereichsbasierte Schattierung 
        sh.shardCollection("<database>.<collection>", { <shard key field> : 1, ... } )

Wie man MongoDB-Seitenfehler verhindert

  1. Fügen Sie Shards hinzu oder stellen Sie Sharding-Cluster bereit, um die Last zu verteilen
  2. Haben Sie genügend RAM für Ihre Anwendung, bevor Sie sie bereitstellen
  3. Zu neueren MongoDB-Versionen wechseln und dann zu WiredTiger wechseln
  4. Skalieren Sie vertikal oder horizontal für ein Gerät mit mehr RAM 
  5. Empfohlenen Arbeitsspeicher verwenden und belegten Arbeitsspeicher im Auge behalten

Schlussfolgerung 

Einige wenige Seitenfehler (allein) dauern eine kurze Zeit, in einer Situation mit zahlreichen Seitenfehlern (gesamt) ist dies jedoch ein Hinweis darauf, dass die Datenbank eine große Anzahl von Daten einliest die Scheibe. Wenn eine Aggregation auftritt, gibt es weitere MongoBD-Lesesperren, die zu einem Seitenfehler führen .

Bei der Verwendung von MongoDB können die Größe des Arbeitsspeichers für das System und die Anzahl der Abfragen die Anwendungsleistung stark beeinflussen. Die Leistung einer Anwendung in MongoDB hängt stark vom verfügbaren RAM im physischen Speicher ab, was sich auf die Zeit auswirkt, die die Anwendung benötigt, um eine einzelne Abfrage durchzuführen. Mit ausreichend RAM wird das Auftreten von Seitenfehlern reduziert und die Anwendungsleistung verbessert.