Warum habe ich langsam ausgeführte Abfragen in meinem Amazon DocumentDB-Cluster?
Ich möchte langsam ausgeführte Abfragen in meinem Amazon DocumentDB-Cluster (mit MongoDB-Kompatibilität) untersuchen, um die Leistung zu verbessern.
Lösung
Bei deinem Amazon DocumentDB-Cluster können aus den folgenden Gründen langsam ausgeführte Abfragen auftreten:
- Zu schwache Hardware
- Änderungen in der Workload
- Erhöhter Datenverkehr
- Speicherprobleme
- Suboptimale Abfragepläne
Workload überwachen
Um die Ursache deiner Datenbankleistungsprobleme zu verstehen, überprüfe alle serverweiten Ressourcen, die deine Instance verwendet. Überwache deine Workload und untersuche, wann die Abfrageleistung optimal war und wann die Ausführung der Abfrage begann, lange zu dauern.
Amazon CloudWatch-Metriken verwenden
Verwende die CloudWatch-Metriken für Amazon DocumentDB, um die Cluster-Leistung zu analysieren. Um Leistungsengpässe zu identifizieren, die durch unzureichende Ressourcen verursacht werden, verwende Metriken wie CPUUtilization und FreeableMemory. Um die Speicheroptimierung zu verstehen, verwende Metriken wie BufferCacheHitRatio und LowMemNumOperationsThrottled.
Überwache Metriken auf Betriebsebene, um die Workload auf deiner Instance zu verstehen. Nützliche Metriken sind z. B. DocumentsInserted, DocumentsReturned, DocumentsDeleted und TransactionsAborted. Weitere Informationen findest du unter Metriken überwachen und Alarme einrichten für Amazon DocumentDB-Cluster (mit MongoDB-Kompatibilität).
Performance Insights verwenden
Verwende Performance Insights, um deine Datenbank-Workloads nach Wartezeiten, Abfragen, Hosts, Datenbanken und Anwendungen aufzuschlüsseln. Erfasse den Counter und detaillierte Abfrageinformationen und bewerte, welche Abfragen am meisten zur Datenbanklast beitragen. Eine Datenbanklast, die höher ist als der Wert Max vCPU, zeigt eine gedrosselte Workload für die Instance-Klasse an. Analysiere den Abfragetext, um deine Abfragen zu optimieren.
Profiler-Protokolle verwenden
Verwende den Amazon DocumentDB-Profiler, um Laufzeit und Details von Operationen zu protokollieren, die auf deinem Cluster ausgeführt werden. Mit dem Profiler kannst du die langsamsten Operationen auf deinem Cluster überwachen. Dies hilft dir, die Leistung einzelner Abfragen und die Gesamtleistung des Clusters zu verbessern.
Datenbankmethoden verwenden
Führe regelmäßig den Befehl currentOp() auf deiner Amazon DocumentDB-Instance aus, um die Systemauslastung über die Zeit zu überwachen:
db.adminCommand({currentOp: 1, $all: 1});
Um die Anzahl der Abfragen und Operationen in jedem Namespace im System zu zählen, führe den folgenden Befehl aus:
db.adminCommand({ aggregate: 1, pipeline: [ { $currentOp: { allUsers: true, idleConnections: true } }, { $group: { _id: { desc: "$desc", ns: "$ns", WaitState: "$WaitState" }, count: { $sum: 1 } } } ], cursor: {} });
Nachdem du den Befehl ausgeführt hast, analysiere die Ergebnisse zur Systemauslastung, um die Last im System zu verstehen und geeignete Maßnahmen zu ergreifen.
Abfragen optimieren
Nachdem du lang laufende Abfragen identifiziert hast, optimiere deine Abfragen, um die Abfrageleistung zu verbessern.
Den richtigen Abfrageplaner verwenden
Um die Leistung zu verbessern, verwende optimale Indexpläne und aktiviere die Unterstützung für Index-Scans für deine Operatoren. Für Amazon DocumentDB Version 5.0 und höher verwende Planer-Version 2.0, um die erweiterte Abfrageplanung zu nutzen, die grundlegende Operationen wie „suchen“, „aktualisieren“, „löschen“ und „suchen und ändern“ optimiert. Für bestimmte Abfragemuster, bei denen der optimale Index nicht ausgewählt wird, fügt dies Unterstützung für die Funktion „Plan-Cache-Filter“ hinzu, mit der du eine Liste von Indizes angeben kannst, die eine bestimmte Abfrageform verwenden soll.
Statistiken einer Abfrage analysieren
Um die Abfrageleistung zu optimieren, verwende executionStats, um zu analysieren, wie deine Abfragen ausgeführt werden. executionStats liefert die Anzahl der Dokumente, die in jeder Abfragephase verarbeitet werden, die Laufzeit jeder Phase und die Anzahl der Versuche, einen Abfrageplan zu erstellen.
Um die Statistiken deiner Abfrage anzuzeigen, führe den folgenden Befehl aus:
query.explain("executionStats");
Beispieloperation:
db.collection.find({}).limit(2).explain("executionStats");
Die vorherige Beispieloperation analysiert, wie eine Abfrage ausgeführt wird, wenn du versuchst, zwei Dokumente zu finden.
Überprüfe die zurückgegebenen Statistiken. Du kannst einen Index hinzufügen, um vollständige Sammlungs-Scans zu reduzieren und die Anzahl der Dokumente zu begrenzen, die die Abfrage durchsuchen muss. Es ist eine bewährte Methode, neue Indizes zu testen und ihre Leistung zu bewerten. Verwende die Option Klonen oder Snapshot-Wiederherstellung, um eine Testumgebung zu erstellen.
Instance auf ineffiziente Indizes überprüfen
Jeder Index verursacht zusätzliche Schreiblatenz, CPU-Nutzung, E/A-Operationen und belegten Speicherplatz auf deiner Ressource. Obwohl Indizes die Abfrageleistung verbessern können, ist es eine bewährte Methode, deine Indizes regelmäßig zu überprüfen und ungenutzte Indizes zu entfernen.
Um eine Aufschlüsselung zu sehen, wie häufig jeder Index verwendet wird, führe einen Befehl ähnlich dem folgenden Beispiel aus:
db.collection.aggregate([{$indexStats:{}}]).pretty()
Um die Gesamtzahl der Scans anzuzeigen, die mit Indizes durchgeführt wurden (Index-Scans), führe den folgenden Befehl aus:
db.collection.stats()
Vergleiche die Anzahl aus der vorherigen Abfrage mit der Anzahl der Scans, die ohne Index durchgeführt wurden (Sammlungs-Scans). Analysiere anschließend, wie häufig Operationen Indizes verwenden, wenn sie auf eine Sammlung zugreifen.
Inaktive Cursor auf deiner Instance schließen
Amazon DocumentDB-Instances haben ein Limit für offene aktive Cursor zu einem bestimmten Zeitpunkt. Der Instance-Typ, den du verwendest, bestimmt dieses Limit. Weitere Informationen findest du unter Instance-Limits. Verwende CloudWatch, um die Metrik DatabaseCursors zu überwachen und die Anzahl der geöffneten Cursor zu überprüfen.
Um weitere Details zu offenen Cursor zu sehen, führe einen Befehl ähnlich dem folgenden Beispiel aus:
db.runCommand("listCursors")
Es ist eine bewährte Methode, Cursor nach der Verwendung zu schließen, um Drosselung zu vermeiden. Inaktive Cursor verbrauchen CPU und Speicher, um die zugehörige Warteschlange zu überwachen.
Ähnliche Informationen
- Themen
- Database
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 7 Monaten
AWS OFFICIALAktualisiert vor 2 Jahren