Wie behebe ich Probleme mit hoher CPU-Auslastung auf meiner Instance von RDS für SQL Server?

Lesedauer: 6 Minute
0

Ich erlebe eine hohe CPU-Auslastung auf meinen DB-Instances beim Amazon Relational Database Service (Amazon RDS) für Microsoft SQL Server. Wie kann ich das Problem einer hohen CPU-Auslastung angehen und beheben?

Kurzbeschreibung

Häufige Gründe für eine erhöhte CPU-Auslastung sind die folgenden:

  • Vom Benutzer initiierte hohe Workloads, mehrere gleichzeitige Abfragen oder lang andauernde Transaktionen
  • Verwenden eine Instance-Klasse mit Unterkapazität für den Workload
  • Veraltete Statistiken und Indexfragmentierung oder fehlende Indizes
  • Abfragen mit Verbesserungspotenzial
  • Blockierung und Deadlocks
  • Parallelität
  • Häufiges Kompilieren und Neukompilieren
  • Parameter-Sniffing
  • Überstrapazierung der Threads

Verwenden Sie die folgenden Tools, um die Quelle der CPU-Auslastung in Ihrer Server-Instance von Amazon RDS für SQL Server zu ermitteln:

  • Amazon-CloudWatch-Metriken für Amazon RDS
  • Enhanced Monitoring
  • Performance Insights
  • Native SQL-Server-Tools

Nachdem Sie die Quelle identifiziert haben, können Sie Ihren Workload analysieren und optimieren, um die CPU-Auslastung zu reduzieren.

Auflösung

Amazon-CloudWatch-Metriken für Amazon RDS

Sie können CloudWatch-Metriken verwenden, um CPU-Muster über längere Zeiträume zu identifizieren. Vergleichen Sie die Diagramme für WriteIOPs, ReadIOPs, ReadThroughput und WriteThroughput zusammen mit der CPU-Auslastung, um die Zeiträume zu ermitteln, in denen der Workload eine hohe CPU-Leistung verursacht. Weitere Informationen finden Sie unter Amazon-CloudWatch-Metriken für Amazon RDS.

Wenn Sie eine Instance aus der Instance-Klasse t2 oder t3 verwenden, überprüfen Sie, ob Ihre Instance Unterkapazität hat. Wenn Sie einen stetigen Rückgang des CPU-Guthabens und eine konstant erhöhte Auslastung des CPU-Guthabens feststellen, reichen Ihre CPU-Kerne nicht für Ihren Workload aus.

Nachdem Sie den Zeitrahmen identifiziert haben, können Sie die Ihrer DB-Instance zugeordneten Enhanced-Monitoring-Daten überprüfen. Sie können Enhanced Monitoring so einstellen, dass Daten in Intervallen von 1, 5, 10, 15, 30 oder 60 Sekunden erfasst werden. Auf diese Weise können Sie Daten auf einer detaillierteren Ebene als CloudWatch sammeln.

Enhanced Monitoring

Wenn Sie Enhanced Monitoring eingerichtet haben, können Sie damit das auf Ihrer DB-Instance ausgeführte Betriebssystem überwachen. Gehen Sie wie folgt vor, um die CPU-Auslastung mit Enhanced Monitoring zu überprüfen:

  1. Wählen Sie in der RDS-KonsoleDatenbanken und anschließend Ihre Datenbank aus.
  2. Wählen Sie auf der Registerkarte Monitoring (Überwachung) im Dropdown-Menü Monitoring die Option OS process list (Betriebssystem-Prozessliste) aus. Überprüfen Sie, ob die hohe CPU-Auslastung vom Betriebssystem, einem RDS-Prozess, einem SQL-Server-Prozess oder einem SQL-Agent-Prozess getrieben wird. Sie können auch den Prozentsatz der CPU und den Prozentsatz des Speichers überprüfen, der von diesen Prozessen verwendet wird.
  3. Wählen Sie Metriken aus der Dropdown-Liste Enhanced Monitoring aus, um Leistungs-Überwachungsdaten zu überprüfen. Zu diesen Metriken gehören CPU-Leerlauf, Kernel und Benutzer. Diese Metriken sagen Ihnen, ob die CPU die meiste Zeit im Leerlauf verbringt, den Kernel ausführt oder Benutzerprozesse ausführt.
  4. Zeigen Sie andere Metriken an, indem Sie Manage Graphs (Diagramme verwalten) auswählen. Anschließend können Sie die Metriken für I/O und Festplattendurchsatz auswählen. Zu diesen Metriken gehören Read/s, Write/s, Read Kb/s und Write Kb/s. Sie können auch Arbeitsspeicher-bezogene Parameter wie Verfügbarer Arbeitsspeicher, SQL-Server-Arbeitsspeicher und Gesamt-Arbeitsspeicher anzeigen. Diese Metriken sind hilfreich, denn sollte Ihre CPU zu viel Zeit damit verbringen, auf Ressourcen zu warten, kann es zu einer hohen CPU-Auslastung kommen.

Weitere Informationen finden Sie unter Anzeigen von Betriebssystem-Metriken in der RDS-Konsole.

Performance Insights

Mit Erkenntnissen zur Amazon-RDS-Leistung können Sie Abfragen identifizieren, die für das Laden der Datenbank verantwortlich sind. Gehen Sie dazu wie folgt vor:

  1. Überprüfen Sie die SQL-Registerkarte, die dem Zeitraum entspricht, den Sie analysieren möchten.
  2. Identifizieren Sie die Abfrage, die am längsten braucht.
  3. Überprüfen Sie ressourcenintensive Abfragen und die in diesem Zeitraum beobachteten Warte-Ereignisse. Die folgenden Warte-Ereignisse sind häufig mit einer hohen CPU-Auslastung verbunden:
    SOS_SCHEDULER_YIELD: Diese Wartezeit zeigt an, dass ein Worker ausgesetzt hat, damit ein anderer ausgeführt werden kann. Hohe Wartezahlen mit niedrigen Wartezeiten weisen normalerweise auf CPU-gebundene Abfragen hin. Hohe Wartezeiten können hier durch Probleme mit dem Aussetzen verursacht werden. Wenn Sie hier eine lange Wartezeit sehen, müssen Sie den Workload weiter überprüfen.
    Wenn SOS_SCHEDULER_YIELD der vorherrschende Wartetyp ist, deutet dies möglicherweise darauf hin, dass der CPU-Druck Probleme bereitet. Überprüfen Sie die Art des Workload und führen Sie zusätzliche Optimierungen durch.
    CXPACKET und CXCONSUMER: Warte-Ereignisse im Zusammenhang mit Parallelität sind normalerweise kein Problem. Wenn Warte-Ereignisse jedoch häufig auftreten und sich auf die Leistung auswirken, überprüfen Sie die Abfragen und legen Sie geeignete Werte für den Kostenschwellenwert der Parallelität fest. Stellen Sie sicher, dass SQL Server den kostengünstigeren Parallelitätsparameter in der Parametergruppe auswählt.
    Sie können den MAXDOP (Max Degree of Parallelism) auch auf Abfrage- oder Instance-Ebene basierend auf Ihrem Anwendungsfall auf 1 erhöhen.
    ThreadPool: Dieses Warte-Ereignis zeigt die Erschöpfung des Threads an. Wenn Ihre Instance-Klasse dazu geeignet ist, erhöhen Sie den Max-Worker-Threads-Parameter. ThreadPool-Wartezeiten können aufgrund übermäßiger Inanspruchnahme von Threads auftreten. Threads werden aufgrund von Blockierungen, einer großen Workload oder einer hohen Anzahl paralleler Abfragen übermäßig verwendet. Oder diese Wartezeit könnte durch eine Fehlkonfiguration des Max-Worker-Threads-Parameters verursacht werden.
  4. Überprüfen Sie die Datenbankmetriken auf Batch-Anforderungen, SQL-Kompilierungen und SQL-Neukompilierungen. Überprüfen Sie, ob Abfragen oft kompiliert werden, was auf improvisierte Abfragen hinweist. Überprüfen Sie auch, ob Abfragen für einen bestimmten Batch häufig neukompiliert werden, was auf die Verwendung von with recompile im Abfragecode hinweist. Beides verursacht eine hohe CPU-Auslastung.

Native SQL-Server-Tools

Spezifische Abfragen zur CPU-Problembehandlung: Weitere Informationen finden Sie unter Behandeln von Problemen mit hoher CPU-Auslastung in SQL Server auf der Microsoft-Dokumentations-Website. Konzentrieren Sie sich auf CPU-intensive Abfragen, Aktualisierungs-Statistiken, fehlende Indizes und Parameter-Sniffing.

Überprüfen Sie den Ausführungsplan auf Abfragen mit schlechter Leistung und führen Sie zusätzliche Optimierungen durch. Weitere Informationen finden Sie unter Anzeigen eines tatsächlichen Ausführungsplans auf der Microsoft-Dokumentations-Website.

Behandeln Sie übermäßiges Sperren, Blockieren und Deadlock-bezogene Probleme mithilfe von Abfragen und Extended Events. Weitere Informationen finden Sie unter Verstehen und Beheben von Blockierungsproblemen bei SQL Server auf der Microsoft-Dokumentations-Website.

Hinweis: Sie können nicht die normale Methode zum Speichern von XEL-Dateien verwenden, wenn Sie Extended Events in RDS für SQL Server konfigurieren. Anweisungen zum Konfigurieren von Extended Events finden Sie unter Einrichten von Extended Events in Amazon RDS für SQL Server.

Verwenden Sie SQL-Server-Berichte, um die Leistungsberichte abzurufen, die nativ in SQL Server verfügbar sind. Verwenden Sie diese Berichte, um Ihren Workload zu optimieren. Weitere Informationen finden Sie unter Performance Dashboard auf der Microsoft-Dokumentations-Website.