Wie kann ich eine hohe CPU-Auslastung auf meinen DocumentDB-Instances beheben?

Lesedauer: 7 Minute
0

Ich beobachte eine hohe CPU-Auslastung auf meinen Amazon DocumentDB (mit MongoDB-Kompatibilität) DB-Instances.

Kurzbeschreibung

Die CPU-Auslastung Ihrer Amazon DocumentDB-Instances hilft Ihnen zu verstehen, wie sich Ihre derzeit zugewiesenen Ressourcen im Hinblick auf die laufende Workload verhalten.

Aus den folgenden Gründen können Sie einen Anstieg der CPU-Auslastung beobachten:

  • Vom Benutzer initiierte hohe Workloads
  • Ineffiziente Abfragen
  • Der Schreiber im Cluster ist überlastet, weil die Leselast im Cluster nicht ausgeglichen ist
  • Der Leser hat eine niedrigere Hardwarekonfiguration als der Schreiber und kann mit der hohen Schreib-Workload nicht synchronisiert werden
  • Interne Aufgaben wie die Garbage Collection im Amazon DocumentDB-Cluster
  • Zu viele Datenbankverbindungen (inaktiv)
  • Kurze Verbindungsspitzen

Um die Hauptquellen der CPU-Auslastung in Ihrer Amazon DocumentDB-Instance zu identifizieren, überprüfen Sie diese Aspekte:

  • Amazon CloudWatch-Metriken
  • Leistungserkenntnisse
  • Systemeigene Datenbankabfragen
  • Die Effizienz von Abfragen überprüfen
  • Aggressive Protokollierungseinstellungen

Nachdem Sie die Ursache identifiziert haben, analysieren und optimieren Sie Ihre Workload, um die CPU-Auslastung zu reduzieren. Wenn das Problem weiterhin besteht, erhöhen Sie Ihre Instance-Größe entsprechend Ihrer Workload.

Behebung

CloudWatch-Metriken verwenden

Amazon DocumentDB ist in CloudWatch integriert und ermöglicht es Ihnen, Betriebsmetriken für Ihre Cluster zu sammeln und zu analysieren.

Mit CloudWatch-Metriken können Sie die CPU und ihre proportionalen Metrikmuster über längere Zeiträume identifizieren. Überprüfen Sie diese Metriken und überwachen Sie sie dann in der CloudWatch-Konsole:

  • Verwenden Sie DatabaseConnections und DatabaseConnectionsMax, um die Anzahl der Verbindungen zu einem bestimmten Zeitpunkt zu ermitteln.
  • Verwenden Sie SchreibenIOps, LesenIOPS, Lesedurchsatz und Schreibdurchsatz, um die Gesamtauslastung Ihrer Amazon DocumentDB-Instance zu verstehen.
  • Verwenden Sie DokumenteGelöscht, DokumenteEingefügt, DokumenteZurückgegeben und DoKumenteAktualisiert. Die Metriken können Ihnen helfen, die Benutzer-Workload in Ihrer Amazon DocumentDB-Instance zu verstehen.
  • Wenn Sie die Instance-Klassen T3 oder T4 verwenden, überprüfen Sie CPU-Guthaben und CPU-Überschuss-Guthaben, um zu überprüfen, ob Rechendrosselung vorliegt.

Leistungserkenntniss-Metriken verwenden

Verwenden Sie Einblicke in die Amazon DocumentDB-Leistung, um Abfragen zu identifizieren, die zum Lade- und Wartestatus der Datenbank beitragen. Verwenden Sie unter der Option Metriken verwalten die durchschnittlichen aktiven Sitzungen, um die Last und die CPU-Verteilung zu überprüfen (system%, user% oder total%).

Ein Lastdurchschnitt, der über der Anzahl der vCPUs liegt, weist darauf hin, dass die Instance stark ausgelastet ist. Beispielsweise kann der Lastdurchschnitt unter dem der vCPUs für die DB-Instance-Klasse liegen. Dies deutet darauf hin, dass CPU-Drosselung möglicherweise nicht die Ursache für die Anwendungslatenz ist. Überprüfen Sie den Lastdurchschnitt und analysieren Sie die relevanten Wartezustände, um die Ursache der zusätzlichen CPU-Auslastung wie I/O, Sperren und Latch zu ermitteln.

Systemeigene Datenbankabfragen verwenden

Systemeigene Abfragen können Ihnen helfen, die Workload zu analysieren und die CPU-Auslastung zu überprüfen. Verwenden Sie die MongoDB-Shell, um diese Abfrage auszuführen. Dies listet alle Operationen auf, die derzeit auf einer Amazon DocumentDB-Instance ausgeführt werden:

db.adminCommand({currentOp: 1, $all: });

Diese Abfrage verwendet den Befehl AktuelleOp, um alle Abfragen aufzulisten, die entweder blockiert sind oder länger als 10 Sekunden ausgeführt wurden:

db.adminCommand({aggregate: 1,
                 pipeline: [{$currentOp: {}},
                            {$match: {$or: [{secs_running: {$gt: 10}},
                                            {WaitState: {$exists: true}}]}},
                            {$project: {_id:0,
                                        opid: 1,
                                        secs_running: 1,
                                        WaitState: 1,
                                        blockedOn: 1,
                                        command: 1}}],
                 cursor: {}
                });

Um die Ergebnisse der Systemauslastung zu analysieren, führen Sie diese Abfrage für die Instance aus, auf der Sie eine hohe CPU-Auslastung beobachten. Diese Abfrage gibt eine Zusammenfassung aller Abfragen zurück, die in jedem Namespace ausgeführt werden. Es listet auch alle internen Systemaufgaben und die eindeutige Anzahl von Wartezuständen pro Namespace auf.

db.adminCommand({aggregate: 1,
                 pipeline: [{$currentOp: {allUsers: true, idleConnections: true}},
                            {$group: {_id: {desc: "$desc", ns: "$ns", WaitState: "$WaitState"}, count: {$sum: 1}}}],
                 cursor: {}
                });

Hinweis: Die GABAGE_COLLECTION-Metrik unter den internen Aufgaben ist die MVCC-Implementierung im Amazon DocumentDB-Cluster. Dies ist ein Hintergrund-Sweeper, der tote Dokumentversionen entfernt und sich auf die Anzahl der Aktualisierungen oder Löschungen in Ihrer Datenbank bezieht. Der Sweeping-Prozess wird auf der Grundlage interner Schwellenwerte auf Sammlungsebene ausgelöst und führt zu Lese-/Schreib-IOPs und CPU-Auslastung.

Die Effizienz von Abfragen überprüfen

Den Index-Overhead für Schreibabfragen überprüfen

Zu viele Indizes oder viele ungenutzte Indizes, die mit Ihrer Datenbank verknüpft sind, können zu einem zusätzlichen Overhead für Ihre Schreibvorgänge beitragen. Überprüfen Sie die Indexstatistiken, um die Indexnutzung zu analysieren und sie zu identifizieren.

Den Erläuterungsplan der Abfrage überprüfen

Abfragen können langsam ablaufen, da sie einen vollständigen Scan der Sammlung erfordern, um die relevanten Dokumente auszuwählen. Erstellen Sie geeignete Indizes, um die Geschwindigkeit der Abfrage zu verbessern.

Verwenden Sie den Befehl Erklären, um die Felder zu identifizieren, für die Sie Indizes erstellen möchten. Sie können Profiler-Protokolle auch verwenden, um Abfragen mit langer Laufzeit und die Details ihrer Vorgänge zu erfassen.

Die Statistiken der Sammlungen überprüfen

Überprüfen Sie diese Statistiken für die Sammlungen, die Sie verwenden:

  • Sehen Sie sich den Abschnitt mit den Häufigsten Abfragen in den Leistungserkenntnissen an, um die Sammlungen zu ermitteln, die am meisten zur Auslastung beitragen.
  • Sehen Sie sich die Statistiken der Sammlung an, um zu erfahren, wie viele Einfüge-, Aktualisierungs- und Löschvorgänge für die Sammlung ausgeführt wurden. Sie können auch die Anzahl der durchgeführten Indexscans und vollständigen Sammlungsscans überprüfen.
  • Teilen Sie Ihre Sammlungen auf, um die Größe der zu verarbeitenden Dokumente zu reduzieren, insbesondere wenn Sie eine große Anzahl von Aktualisierungsvorgängen haben.

Die Aggressive Logging-Einstellungen überprüfen

Die Prüfung von Ereignissen hat Vorrang vor dem Datenbankverkehr. Wenn keine Prüfung erforderlich ist, können Sie sie deaktivieren. Wenn Sie eine Prüfung benötigen, legen Sie den Parameter audit_logs so fest, dass nur die Ereignisse protokolliert werden, die erforderlich sind. Planen Sie eine höhere Auslastung ein und wechseln Sie dann bei Bedarf zu einer größeren Instance-Klasse.

Stellen Sie bei Profiler-Protokollen sicher, dass der richtige Wert für den Parameter profiler_threshold_ms festgelegt ist, um eine aggressive Protokollierung zu vermeiden. Überprüfen Sie die Workload Ihrer Anwendung, um den richtigen Schwellenwert zu ermitteln, den Sie benötigen, um eine Abfrage als lang andauernd zu kategorisieren.

Vergewissern Sie sich, dass Sie die Option Protokollexporte für die Protokolle aktiviert haben, die Sie nach CloudWatch exportieren möchten.

Bewährte Methoden anwenden

Die Lese-Workload auf den Leser verlagern

Wenn Sie mehrere DB-Instances in Ihrem Amazon DocumentDB-Cluster haben, verlagern Sie die Lese-Workload auf Ihre Leser-Instance. Wenn Sie eine Verbindung als Replikatsatz herstellen, können Sie die Lese-Eigenschaft für die Verbindung festlegen. Wenn Sie als Lesepräferenz SekundärBevorzugt angeben, versucht der Client, die Leseabfragen an Ihre Replikate weiterzuleiten. Der Client versucht, Schreibanfragen an Ihre primäre DB-Instance weiterzuleiten.

Beachten Sie, dass die Leser letztendlich konsistent sind. Wenn eine Workload eine stärkere Konsistenz beim Lesen nach dem Schreiben erfordert, verwenden Sie die dynamische Lesepräferenz und überschreiben Sie sie auf Abfrageebene. Beispielsweise können Sie auf Verbindungsebene standardmäßig SekundärBevorzugt verwenden, sodass Abfragen an sekundäre Abfragen weitergeleitet werden. Wenn Sie Abfragen haben, die eine stärkere Konsistenz beim Lesen nach dem Schreiben erfordern, können Sie die Standardeinstellung überschreiben. Siehe dieses Beispiel:

db.collection.find().readPref("primary")

Dem Cluster eine oder mehrere Leser-Instances hinzufügen

Wenn Sie über einen DocumentDB-Cluster mit einer einzelnen DB-Instance (nur Schreiber) verfügen, fügen Sie dem Cluster eine oder mehrere Leser-DB-Instances hinzu. Verwenden Sie dann Lese-Eigenschaft=sekundärBevorzugt, um die Last effizient zu verwalten.

Amazon DocumentDB Profiler verwenden, um langsame Abfragen zu identifizieren

Verwenden Sie den Amazon DocumentDB Profiler, um langsame Abfragen zu protokollieren. Wenn eine Abfrage wiederholt in den Protokollen für langsame Abfragen erscheint, benötigen Sie möglicherweise einen zusätzlichen Index, um die Leistung zu verbessern.

Suchen Sie nach Abfragen mit langer Laufzeit, die über eine oder mehrere Stufen verfügen, die mindestens eine COLLSCAN-Stufe ausführen. Dies bedeutet, dass in der Abfragephase jedes Dokument in der Sammlung gelesen werden muss, um eine Antwort auf die Abfrage zu geben.

Weitere Informationen finden Sie unter Langsam ausgeführte Abfragen in Amazon DocumentDB (mit MongoDB-Kompatibilität) profilieren.

Eine Alarmbenachrichtigung mit CloudWatch erstellen

Erstellen Sie einen CloudWatch-Alarm, der Sie benachrichtigt, wenn die CPU-Auslastung-Metrik einen bestimmten Schwellenwert überschreitet.

Die Instance-Klasse Ihrer DB-Instances hochskalieren

Wenn es keinen weiteren Umfang für die Abfrageoptimierung gibt, skalieren Sie die Instance-Klasse der Instances im Cluster, um die Workload zu bewältigen.

Hinweis: Wenn Sie eine Instance-Klasse hochskalieren, erhöht dies die Kosten. Weitere Informationen finden Sie unter Amazon DocumentDB-Preise.

Ähnliche Informationen

Amazon DocumentDB-Cluster skalieren

Leistung und Ressourcennutzung

So indexieren Sie auf Amazon DocumentDB (mit MongoDB-Kompatibilität)

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 6 Monaten