Datenbankleistung durch Vergleich von Leistungs-Snapshots optimieren

Um Leistungsprobleme in AlloyDB for PostgreSQL-Datenbanken zu identifizieren und zu beheben, können Sie Snapshots von Systemmesswerten zwischen zwei Zeitpunkten vergleichen, indem Sie manuell Performance Snapshot Reports erstellen. Zu den Systemmesswerten, die in jedem Snapshot erfasst werden, gehören die Nutzung der virtuellen CPU (vCPU), die Arbeitsspeichernutzung, die Laufwerk-E/A, die Anzahl der Transaktionen und Warteereignisse.

Automatische und manuelle Snapshots

AlloyDB unterstützt die folgenden Snapshots:

  • Automatische Snapshots:Standardmäßig erstellt AlloyDB einmal täglich automatisch Snapshots und speichert sie 7 Tage lang. Mit automatischen Snapshots können Berichte mit täglicher Arbeitslastgranularität erstellt werden. Sie können die Häufigkeit und Aufbewahrungsdauer eines automatischen Snapshots konfigurieren.

  • Manuelle Snapshots:Sie können manuell Snapshots erstellen und Berichte generieren.

Sie können automatische und manuelle Snapshots kombinieren, um Leistungsberichte zu erstellen. Sie können beispielsweise einen Performance Snapshot Report erstellen, in dem ein manuell erstellter Snapshot mit einem automatischen Snapshot verglichen wird.

In diesem Dokument wird beschrieben, wie Sie manuell Performance Snapshot Reports erstellen.

Funktionsweise von Performance Snapshot Reports

Performance Snapshot Reports sind ein integriertes AlloyDB-Tool, mit dem Leistungsdaten erfasst und analysiert werden, um die Ursache von Leistungsproblemen zu ermitteln. Dieses Tool ergänzt andere AlloyDB-Beobachtbarkeitsfunktionen wie Systemstatistiken, Query Insights, und den Metrics Explorer, die Echtzeitmesswerte zu Ihrer Instanz liefern.

In Performance Snapshot Reports werden Datenbankmesswerte zwischen zwei Zeitstempeln in einem einzigen Bericht angezeigt. Anhand der Informationen im Performance Snapshot Report können Sie Leistungsprobleme mit der Instanz des Performance Snapshot Reports identifizieren, z. B. eine verringerte Datenbankleistung zu bestimmten Tageszeiten oder eine verringerte Leistung über einen bestimmten Zeitraum. Bei Verwendung auf einem Lesepoolknoten hilft der Bericht dabei, zu ermitteln, ob die Replikationsverzögerung auf Einschränkungen der Systemressourcen wie CPU oder Arbeitsspeicher oder auf bestimmte Abfragekonflikte wie Puffer-Pins zurückzuführen ist.

Mit dem Performance Snapshot Report vergleichen Sie die Messwerte mit einer Leistungs-Baseline, um Einblicke in die Messwerte der Arbeitslastleistung zu erhalten, die Sie zur Optimierung oder Fehlerbehebung der Datenbankleistung verwenden können. Eine Baseline ist eine benutzerdefinierte Gruppe von Datenbank-Snapshots, mit denen die Standardleistung und das Standardverhalten einer Datenbank für eine bestimmte Konfiguration und Arbeitslast gemessen werden.

Informationen zu Warteereignissen im Performance Snapshot Report finden Sie in der Referenz für den Datenbank-Performance Snapshot Report.

Erforderliche Rollen

Sie benötigen die alloydbsuperuser Rolle. Standardmäßig gewährt AlloyDB die Rolle pg_monitor für alloydbsuperuser. Weitere Informationen finden Sie unter Vordefinierte PostgreSQL-Rollen.

Wenn Sie Ihre anderen selbst definierten Rollen verwenden möchten, führen Sie zuerst GRANT pg_monitor TO my_user als alloydbsuperuser aus. Weitere Informationen finden Sie unter Einem Konto der Identitäts- und Zugriffsverwaltung (Identity and Access Management, IAM) die entsprechende Rolle zuweisen.

Snapshots erstellen

Performance-Snapshots sind ein leistungsstarkes Tool, um die Datenbankleistung zu verstehen und zu optimieren. Sie erfassen wichtige Systemmesswerte zu einem bestimmten Zeitpunkt, sodass Sie die Leistung Ihrer Datenbank zwischen zwei Zeitpunkten vergleichen können. AlloyDB unterstützt zwei Arten von Snapshots:

  • Snapshots von Systemmesswerten:Diese Snapshots erfassen wichtige Systemmesswerte wie die vCPU-Auslastung, die Arbeitsspeichernutzung und die Laufwerk-E/A.
  • Snapshots von Systemmesswerten und SQL-Ausführungsstatistiken:Diese Snapshots enthalten alle Systemmesswerte aus einem Standardsnapshot sowie detaillierte SQL-Ausführungsstatistiken aus der Erweiterung pg_stat_statements.

So können Sie den Detaillierungsgrad auswählen, den Sie für Ihre Analyse benötigen.

Snapshot von Systemmesswerten erstellen

Erstellen Sie einen Snapshot am Anfang und am Ende der gewünschten Arbeitslast. Das Zeitintervall zwischen den beiden Snapshots sollte lang genug sein, um eine repräsentative Stichprobe der Arbeitslast zu erfassen.

So optimieren Sie die Leistung der AlloyDB-Datenbank:

  1. Erstellen Sie Baseline-Snapshots, wenn Ihre Datenbank inaktiv ist oder eine durchschnittliche Last aufweist.
  2. Verbinden Sie einen psql Client mit einer AlloyDB-Instanz. Für einen Lesepoolknoten müssen Sie eine direkte Verbindung zu seiner IP-Adresse herstellen. Weitere Informationen finden Sie unter Liste der IP-Adressen von Lesepoolknoten abrufen.
  3. Führen Sie SELECT perfsnap.snap() aus. Die Ausgabe sieht dann ungefähr so aus:

    postgres=# select perfsnap.snap();
     snap
    ------
        1
    (1 row)
    

    Die Ausgabe dieses Befehls gibt die Snapshot-ID (snap_id) zurück, die in diesem Beispiel 1 ist. Sie benötigen diese ID, um später einen Performance Snapshot Report zu erstellen. Die snap_id in Ihrer eigenen Umgebung ist wahrscheinlich anders.

  4. Vergleichen Sie die Berichte, die Sie mit beiden Snapshot-Gruppen erstellt haben, und ermitteln Sie Änderungen, die die Leistung verbessern könnten. Weitere Informationen zu Leistungsempfehlungen finden Sie unter Empfehlungen zur Optimierung der Datenbankleistung.

Nachdem Sie Messwerte aus dem resultierenden Performance Snapshot Report erhalten haben, können Sie eine weitere Gruppe von Snapshots erstellen und den Vorgang wiederholen.

Snapshot mit Statistiken zur SQL-Ausführung erstellen

Standardmäßig verwendet AlloyDB die Erweiterung pg_stat_statements, um SQL-Anweisungen zu verfolgen. Wenn Sie detaillierte SQL-Ausführungsstatistiken in Ihren Leistungsbericht aufnehmen möchten, müssen Sie zuerst die Erweiterung pg_stat_statements in Ihrer postgres-Datenbank erstellen. Beachten Sie, dass die Erfassung dieser Statistiken durch das Flag pg_stat_statements.track aktiviert wird, nicht durch die Erstellung der Erweiterung selbst.

So erstellen Sie einen Snapshot, der auch SQL-Ausführungsstatistiken enthält:

  1. Erstellen Sie die Erweiterung pg_stat_statements in der postgres-Datenbank.

    postgres=# CREATE EXTENSION pg_stat_statements;
    
  2. Wenn Sie jetzt einen Snapshot erstellen, werden automatisch die SQL-Statistiken aus pg_stat_statements eingefügt.
      postgres=# select perfsnap.snap();
        snap
      ------
          2
      (1 row)
      

Liste der Snapshots ansehen

  1. Verbinden Sie einen psql Client mit einer AlloyDB-Instanz. Für einen Lesepoolknoten müssen Sie mit psql eine direkte Verbindung zu seiner IP-Adresse herstellen. Weitere Informationen finden Sie unter Liste der IP-Adressen von Lesepoolknoten abrufen.
  2. Führen Sie SELECT * FROM perfsnap.g$snapshots aus. Die Ausgabe sieht dann ungefähr so aus:
    postgres=# select * from perfsnap.g$snapshots;
     snap_id |           snap_time           | instance_id  |               node_id           | snap_description  | snap_type | is_baseline
    ---------+-------------------------------+--------------+---------------------------------+-------------------+-----------+-------------
           1 | 2023-11-13 22:13:43.159237+00 | perf-primary | sab3-perf-primary-cab835ef-4cm8 | Manual snapshot   | Manual    | f
           2 | 2023-11-13 22:53:40.49565+00  | perf-primary | sab3-perf-primary-cab835ef-4cm8 | Automatic snapshot| Automatic | f
           3 | 2023-11-13 22:56:42.57094+00  | perf-replica | sab3-perf-replica-b9250422-tz4n | Automatic snapshot| Automatic | f
           4 | 2023-11-13 22:56:42.59476+00  | perf-replica | sab3-perf-replica-b9250422-63q3 | Automatic snapshot| Automatic | f
           5 | 2023-11-13 23:11:55.23157+00  | perf-replica | sab3-perf-replica-b9250422-tz4n | Manual snapshot   | Manual    | f
    (5 rows)

Performance Snapshot Report erstellen

Führen Sie Folgendes aus, um einen Bericht zu erstellen, in dem der Unterschied zwischen zwei Snapshots erfasst wird, z. B. zwischen Snapshot 1 und 2:
SELECT perfsnap.report(1,2)

Der zweite Snapshot in einem Differenzvorgang muss nicht unmittelbar auf den ersten Snapshot folgen. Sie müssen den zweiten Snapshot im Differenzvorgang jedoch nach dem ersten Snapshot erstellen.

Der erstellte Performance Snapshot Report sieht ungefähr so aus wie im folgenden gekürzten Beispiel.

Beispielbericht

Hier ein gekürztes Beispiel für einen erstellten Performance Snapshot Report:

Beispiel für einen Performance Snapshot Report

$ psql -d postgres -U alloydbsuperuser
postgres=> select perfsnap.report(22, 23);

report
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 PGSNAP DB Report for:

 Snapshot details
 --------------------------------------
 Host                   i841-sr-primary-2a34f46e-06bc
 Release                14.12
 Startup Time           2024-10-08 03:23:15+00

              Snap Id    Snap Time
 ------------ ---------- ------------------------
 Begin Snap:          22 24.10.2024 04:33:56 (UTC) Automatic snapshot
   End Snap:          23 25.10.2024 04:38:56 (UTC) Automatic snapshot
    Elapsed:                      1 day 00:04:59.979321

 Database Cache sizes
 ~~~~~~~~~~~~~
            Shared Buffers:       31 GB        Block Size:         8192
      Effective Cache Size:       25 GB       WAL Buffers:        16384

 Host CPU
 ~~~~~~~~~~
       %User   %Nice %System   %Idle    %WIO    %IRQ   %SIRQ  %Steal  %Guest
     ------- ------- ------- ------- ------- ------- ------- ------- -------
        1.07    0.22    0.91   97.40    0.09    0.00    0.31    0.00    0.00

 Host Memory
 ~~~~~~~~~~~~
              Total Memory:       63 GB
          Available Memory:       11 GB
               Free Memory:      726 MB
            Buffers Memory:     3706 MB

 Load profile (in bytes)
 ~~~~~~~~~~~~~~~~~~~~~~~            Per Second         Per Transaction
                                    ------------       ---------------
                     Redo size:         63083.64               4489.93
                 Logical reads:          1961.21                139.59
                 ...

 Response Time Profile (in s)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 CPU time:               5399 (   0.39%)
 Wait time:           1386906 (  99.61%)
 Total time:           1392306

 Backend Processes Wait Class Breakdown (in s)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 IO                   119.300 (  98.91%)
 LWLock                 1.305 (   1.08%)
 IPC                     .010 (   0.01%)
 Lock                    .000 (   0.00%)

 Backend Processes Wait Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Event                                          Class         Waits      Time (us)      Avg (us)
 -------------------------------------- ------------- ------------- -------------- -------------
 CPU                                                                    1995948632
 WALInsert                                     LWLock             1           6656          6656

 Vacuum Information
 ~~~~~~~~~~~~~~~~~~~
             Num Analyze operations:             1976
              Num Vacuum operations:             3435

 Per Database Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Commits       Rollbacks     BlkRds        Blkhits       TempFiles     TempBytes
 ------------------------- ------------- ------------- ------------- ------------- ------------- -------------
 bench                             27939             0             0       7823038             0       0 bytes
 postgres                          39792             0             7      11089243             0       0 bytes

 Per Database DML & DQL Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Tuples returned  Tuples fetched   Tuples inserted  Tuples updated   Tuples deleted   Index splits     Index Only heap fetches   HOT updates
 ------------------------- ---------------- ---------------- ---------------- ---------------- ---------------- ---------------- ------------------------- ----------------
 bench                             16119481          4843262                0                0                0                0                        16                0
 postgres                          25415473          6327188                0               10                0                0                         0                8

 Per Database Conflict Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Lock Timeout  Old Snapshot  Buffer Pins   Deadlock
 ------------------------- ------------- ------------- ------------- -------------
 bench                                 0             0             0             0
 postgres                              0             0             0             0

 Per Database Vacuum Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                      Frozen XID    % Consumed    Aggregate Vacuum Gap
 ------------------------- ------------- ------------- --------------------
 bench                         179460916         9.00%         20539084
 postgres                      179339239         9.00%         20660761

 Per Database Sizing Information
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                    Conn.
 Name                 Collation     Limit   Tablespace           DB Size    Growth
 -------------------- ------------- ------- -------------------- ---------- ----------
 bench                C.UTF-8            -1 pg_default                80 GB    0 bytes
 postgres             C.UTF-8            -1 pg_default               135 MB    0 bytes

 Backend Wait Event Histogram
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Event                                          Class       Waits    <= 1us    <= 2us    <= 4us    <= 8us   <= 16us   <= 32us   <= 64us  <= 128us  <= 256us  <= 512us
 -------------------------------------- ------------- ----------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
 WALInsert                                  LWLock             1         0         0         0         0         0         0         0         0         0         0

 Background Wait Event Histogram
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Event                                          Class       Waits    <= 1us    <= 2us    <= 4us    <= 8us   <= 16us   <= 32us   <= 64us  <= 128us  <= 256us  <= 512us
 -------------------------------------- ------------- ----------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
 WALInsert                                  LWLock           542       107       174        39       113        93         8         1         1         0         1

 Write Ahead Log (WAL) Statistics
 --------------------------------
 Records       Full Page Images   Bytes        Buffers Full   Write         Sync          Write Time    Sync Time
 -----------   ----------------   -----------  ------------   -----------   -----------   -----------   -----------
     2936305                100     805989345             0             0             0             0             0

 Summary Stats (across all databases)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Name                             Value
 -------------------------------- ----------------------------------
 Buffers evicted                  0
 Commits                          1216693
 ...

 Parameter Settings
 ~~~~~~~~~~~~~~~~~~~
 Parameter                         Value
 --------------------------------- --------------------------------------------------------------
 DateStyle                            ISO, MDY
 TimeZone                             UTC
 autovacuum                           on
 work_mem                             4096

 Columnar Engine available size  Columnar Engine configured size
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                       14959MB                         19293MB

 Columnar Engine Statistics
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 name                                                       count
 ---------------------------------------------------------- ------------
 CU Populations/Refreshes                                          13197
 CU Auto Refreshes                                                 10975
 ...
 Columnar Engine Ultra-fast Cache Statistics
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Ultra-fast Cache Size (MB):                        19200
 Ultra-fast Cache Used Size (MB):                       0
 Ultra-fast Cache Block Size (MB):                     80

 SQL Report
 ~~~~~~~~~~
 NOTE: Query might be empty if query ID does not have a match in pg_stat_statements at report time. This is expected if the query is not run recently.
 Per Query Information (Top 50) By Total Elapsed Time
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Query Text                                                                                                 UserID         DBID          DBName          QueryID            Total Elapsed Time(ms)    Execution Count       Avg Elapsed Time(ms)
 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    prepare neword (INTEGER, INTEGER, INTEGER, INTEGER, INTEGER) as select neword($1,$2,$3,$4,$5,$6)        36272        36274            tpcc      -5467151541922966497           276400877.8014            36928106                    7.4848
 prepare payment (INTEGER, INTEGER, INTEGER, INTEGER, INTEGER, INTEGER, NUMERIC, VARCHAR) AS select p        36272        36274            tpcc       3864683359055073968           127719636.4656            36928456                    3.4586
                                        prepare delivery (INTEGER, INTEGER) AS select delivery($1,$2)        36272        36274            tpcc       2323704420019807054            48540963.0880             3694128                   13.1400
                                    prepare slev (INTEGER, INTEGER, INTEGER) AS select slev($1,$2,$3)        36272        36274            tpcc      -8637448842172635004            35361366.9271             3692785                    9.5758
 ...

 Per Query Information (Top 50) By Read IO
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Query Text                                                                                                 UserID         DBID          DBName          QueryID            Total ReadIO Time(ms)        Execution Count    Avg ReadIO Time(ms)    Total buffer hits         Avg buffer hits    Total blk reads         Avg blk reads
 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 prepare ostat (INTEGER, INTEGER, INTEGER, INTEGER, VARCHAR) AS select * from ostat($1,$2,$3,$4,$5) a        36272        36274            tpcc      -1640504351418263816              498072.4004             3693895                    0.1348            80360201         21.75486877672484              105858 0.028657555236410347
                                        prepare delivery (INTEGER, INTEGER) AS select delivery($1,$2)        36272        36274            tpcc       2323704420019807054                  12.5438             3694128                    0.0000          4477308168        1212.0067761593534             1219908 0.33022894712906536
     prepare neword (INTEGER, INTEGER, INTEGER, INTEGER, INTEGER) as select neword($1,$2,$3,$4,$5,$6)        36272        36274            tpcc      -5467151541922966497                   0.8039            36928106                    0.0000         10337394097         279.9329620912592             6245570 0.16912781825312134
              SELECT name, default_version, installed_version FROM pg_catalog.pg_available_extensions           10            5        postgres       6619165036968781114                   0.0000                 361                    0.0000                 361                         1                   0                   0
 ...

 Per Query Information (Top 50) By Standard Deviation of Elapsed Time
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Query Text                                                                                                 UserID         DBID          DBName          QueryID            Begin STDDEV Elapsed Time(ms)  End STDDEV Elapsed Time(ms)
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                           SELECT COUNT($1) FROM perfsnap.g$snapshots           10            5        postgres      -8741741796612173369                      17.8084                      18.1239
                                        prepare delivery (INTEGER, INTEGER) AS select delivery($1,$2)        36272        36274            tpcc       2323704420019807054                      15.0626                      19.8495
     prepare neword (INTEGER, INTEGER, INTEGER, INTEGER, INTEGER) as select neword($1,$2,$3,$4,$5,$6)        36272        36274            tpcc      -5467151541922966497                      13.9820                      17.0074
                                    prepare slev (INTEGER, INTEGER, INTEGER) AS select slev($1,$2,$3)        36272        36274            tpcc      -8637448842172635004                       8.4333                       9.6205

 ----------------------------------------------------
 Created by G_STATS v1.0.100
 ----------------------------------------------------
(xxx rows)

  

Informationen zu Berichtsfeldern und Empfehlungen zur Leistungsoptimierung, siehe Empfehlungen zur Optimierung der Datenbankleistung. Weitere Informationen zu Warteereignissen in Performance Snapshot Reports finden Sie in der Referenz für den Datenbank-Performance Snapshot Report.

Snapshot löschen

Bevor Sie Snapshots löschen können, die Teil einer vorhandenen Baseline sind, müssen Sie die Baseline löschen.

Führen Sie den folgenden Befehl aus, um einen Snapshot zu löschen:

SELECT perfsnap.delete(SNAP_ID);

Ersetzen Sie SNAP_ID durch die ID des Snapshots, den Sie löschen möchten.

Gelöschte Snapshots können nicht wiederhergestellt werden.

Snapshot als Leistungs-Baseline markieren

Führen Sie
SELECT perfsnap.make_baseline(1, 3) aus, um beispielsweise alle Snapshots mit IDs zwischen 1 und 3 als System leistungs-Baseline zu markieren.

Leistungs-Baselines löschen

Führen Sie SELECT perfsnap.clear_baseline(1, 3) aus, um beispielsweise alle Baselines mit IDs zwischen 1 und 3 zu löschen.

Häufigkeit automatischer Snapshots ändern

Standardmäßig werden einmal täglich automatische Snapshots für die primäre Instanz und die Leseknoten erstellt.

Wenn Sie die Häufigkeit automatischer Snapshots anpassen möchten, legen Sie das Flag perfsnap.interval fest, mit dem das automatische Snapshot-Intervall in Sekunden festgelegt wird. Weitere Informationen finden Sie unter Datenbank-Flags konfigurieren.

Wir empfehlen, den Wert des Flags auf mindestens einige Minuten festzulegen, um aussagekräftige Informationen zu erfassen.

Wenn Sie die angepasste Häufigkeit nicht mehr benötigen, setzen Sie das Flag auf den Standardwert zurück, um die Ressourcennutzung zu optimieren. Der Standardwert ist 86400 Sekunden pro Tag.

Aufbewahrungsdauer automatischer Snapshots ändern

Wenn Sie die Aufbewahrungsdauer automatischer Snapshots anpassen möchten, legen Sie das Flag perfsnap.retention fest, mit dem die Dauer festgelegt wird, für die automatische Snapshots aufbewahrt werden. Weitere Informationen finden Sie unter Datenbank-Flags konfigurieren.

Die Standardaufbewahrungsdauer beträgt 7 days.

Datenbankleistung mit den Ergebnissen des Snapshot Reports optimieren

So optimieren Sie die Leistung der AlloyDB-Datenbank:

  1. Erstellen Sie Baseline-Snapshots, wenn Ihre Datenbank im Leerlauf ist oder eine durchschnittliche Last aufweist.
  2. Starten Sie die Arbeitslast oder Abfrage, deren Leistung Sie verbessern möchten.
  3. Wenn die Arbeitslast oder Abfrage die maximale Ressourcennutzung erreicht, erstellen Sie eine weitere Gruppe von Snapshots. Wir empfehlen, für beide Berichte dasselbe Intervall zu verwenden.
  4. Vergleichen Sie die Berichte, die Sie mit beiden Snapshot-Gruppen erstellt haben, und ermitteln Sie Änderungen, die die Leistung verbessern könnten. Weitere Informationen zu Leistungsempfehlungen finden Sie unter Empfehlungen zur Optimierung der Datenbankleistung.

Empfehlungen zur Optimierung der Datenbankleistung

In der folgenden Tabelle sind die Abschnitte des Performance Snapshot Reports und empfohlene Verbesserungen für jeden Berichtsabschnitt aufgeführt. Weitere Informationen zu den Abschnitten des Performance Snapshot Reports und zu Warteereignissen finden Sie in der Referenz für den Datenbank-Performance Snapshot Report.

Abschnitt Berichtsfeld Beschreibung des Berichtsfelds Optimierungsempfehlungen
Snapshot-Details Snapshot-Details Enthält den Host, die mit PostgreSQL kompatible Release-Version und die Zeit, zu der der Computer in Betrieb genommen wurde.
Snapshot-ID Listet die ID und den Zeitpunkt der Snapshots auf, die zum Erstellen dieses Berichts verwendet wurden.
Systemstatistiken Host-CPU Details zur Host-CPU-Auslastung. Wenn die CPU-Auslastung über 80 % liegt, empfehlen wir, auf die nächstgrößere verfügbare Größe zu skalieren. Achten Sie bei Lesepoolinstanzen darauf, dass die Knotengröße mindestens der der primären Instanz entspricht. Kleinere Leseknoten können bei hoher Schreiblast möglicherweise nicht mit der WAL-Generierungsrate der primären Instanz mithalten.
Hostarbeitsspeicher Details zur Hostarbeitsspeicherauslastung. Wenn der kostenlose Arbeitsspeicher weniger als 15 % beträgt, empfehlen wir, auf die nächstgrößere verfügbare Größe zu skalieren. Achten Sie bei Lesepoolinstanzen darauf, dass die Knotengröße mindestens der der primären Instanz entspricht. Kleinere Leseknoten können bei hoher Schreiblast möglicherweise nicht mit der WAL-Generierungsrate der primären Instanz mithalten.
Lastprofil Listet Zähler auf, mit denen Sie Ihre Arbeitslast von Write-Ahead-Logging (WAL), E/A-Anforderungen und Verbindungsverwaltung qualifizieren können. Wenn die Anzahl der physischen Lesevorgänge höher ist als die Anzahl der logischen Lesevorgänge, sollten Sie auf die nächstgrößere verfügbare Größe skalieren, um ein größeres Caching von Daten zu ermöglichen.
Aufschlüsselung der Reaktionszeit und der Warteklasse Aufschlüsselung der Zeit, die von Postgres-Prozessen während der Arbeitslastausführung verbracht wurde. Konzentrieren Sie sich auf die Verkürzung der E/A-Wartezeit, wenn sich die Prozesse beispielsweise hauptsächlich im Wartezustand befinden.
Informationen zur Datenbankarbeitslast Informationen zur Datenbankarbeitslast Wichtige Messwerte für jede Datenbank, einschließlich Commits, Rollbacks, Trefferrate und Informationen zu temporären Tabellen und Sortiervorgängen. Wenn die Anzahl der Rollbacks hoch ist, sollten Sie Ihre App diagnostizieren.
DML- und DQL-Informationen pro Datenbank Zähler für Abfragevorgänge. Qualifizieren Sie Ihre Arbeitslast als lese- oder schreiblastig.
Informationen zu Datenbankkonflikten Zähler für häufige Anwendungs- und Datenbankprobleme. Suchen Sie nach Problemen in Ihrer Anwendung, wenn ein Deadlock auftritt. Wenn bei einer Lesepoolinstanz viele Puffer-Pins-Konflikte auftreten, sollten Sie den Wert von max_standby_streaming_delay verringern, damit die Wiedergabe fortgesetzt werden kann. Alternativ können Sie lang andauernde Abfragen in einen anderen Lesepool verschieben, um zu vermeiden, dass Pins über einen längeren Zeitraum gehalten werden.
Informationen zur Datenbankgröße Zeigt, um wie viel die Datenbank im Intervall zwischen zwei Snapshots gewachsen ist. In diesem Feld wird auch angezeigt, ob für die Datenbank Verbindungslimits festgelegt wurden. Suchen Sie nach Problemen in Ihrer Anwendung, wenn das Wachstum der Datenbank zu groß ist.
Informationen zur Bereinigung Informationen zur Bereinigung Details zu E/A und Zähler für Bereinigungsvorgänge. Standardmäßig führt AlloyDB eine adaptive Bereinigung durch. Sie können einige der Bereinigungseinstellungen an Ihre Arbeitslast anpassen. Reduzieren Sie beispielsweise die Anzahl der Bereinigungsvorgänge, wenn zu viel E/A für diese Anfragen verwendet wird.
Informationen zur Bereinigung pro Datenbank Zeigt die folgenden Informationen an:
  • Aktuelles Alter von datfrozenxid (älteste nicht fixierte XIDs) jeder Datenbank oder die Anzahl der Transaktionen von datfrozenxid bis zur XID der aktuellen Transaktion.
  • Nicht fixierte Transaktions-IDs, die von allen Transaktions-IDs verwendet werden.
  • Ergebnis von autovacuum_freeze_max_age - age(pg_database.datfrozenxid), das die ungefähren Altersunterschiede (in Transaktionen) zum Zeitpunkt des zweiten Snapshots angibt, wenn die automatische Bereinigung ausgelöst wird, um Wraparounds auf aggregierter Datenbankebene zu verhindern.
Wenn das Alter des Felds „Frozen XID“ zu hoch ist oder der Prozentsatz der verwendeten Transaktionen nahe 90 % liegt, sollten Sie eine Bereinigung durchführen. Wenn die aggregierte Bereinigungslücke abnimmt, bedeutet das, dass eine Bereinigung von Postgres erzwungen wird, um einen Wraparound zu verhindern.
Details zu Wartezeiten von Datenbankprozessen Detaillierte Informationen zu Back-End- und Hintergrundprozessen Details zu allen Wartezeiten nach Back-End- und Hintergrundprozessen im Berichtsintervall. Die Informationen umfassen die kumulative Wartezeit, die CPU-Zeit und die durchschnittliche Zeit pro Wartezeitentyp. Um beispielsweise die Wartezeit für WALWrite zu verringern, erhöhen Sie die Anzahl der für die Datenbank verfügbaren wal_buffers.
Detailliertes Histogramm der Warteereignisse für Back-End- und Hintergrundprozesse Dieses Histogramm ist standardmäßig im Performance Snapshot Report enthalten. Die Liste enthält das Histogramm der Warteereignisse für Back-End- und Hintergrundprozesse, die in 32 Buckets unterteilt sind, von 1 µs bis über 16 s. Suchen Sie nach den Warteereignissen und prüfen Sie, ob es zu viele Warteereignisse im Bucket mit der längeren Wartezeit gibt. Möglicherweise gibt es ein Problem mit zu vielen Warteereignissen oder mit der jeweils verwendeten Wartezeit.
Sonstige Statistiken Write-Ahead-Log-Statistiken (WAL) Zusammenfassung der WAL-Statistiken. Wenn die Synchronisierungszeit zu lang ist, passen Sie die zugehörigen Datenbank-Flags (GUC) an, um die Arbeitslast zu verbessern. GUC ist das PostgreSQL-Subsystem, das die Serverkonfiguration verwaltet.
Zusammenfassende Statistiken (für alle Datenbanken) Zusammenfassung aller Datenbankvorgänge, die während des Snapshot-Intervalls auftreten.
Parametereinstellungen Parametereinstellungen Wichtige Postgres-Konfigurationsparameter zum Zeitpunkt des End-Snapshots. Prüfen Sie die GUC-Parametereinstellungen (die Postgres-Datenbank-Flags), um festzustellen, ob die Werte unerwartet oder nicht empfehlenswert sind. Bei Lesepoolinstanzen mit hoher Replikationsverzögerung sollten Sie Folgendes anpassen:
  • max_standby_streaming_delay: Optimieren Sie diesen Wert, um die Häufigkeit der Abfrageabbruchs im Verhältnis zur Replikationsverzögerung auszugleichen.
  • alloydb.promote_cancel_to_terminate: Achten Sie darauf, dass diese Option on ist, um Back-Ends, die nicht auf den Abbruch reagieren und die Wiederherstellung blockieren, zwangsweise zu beenden.
  • google_storage.log_replay_throttle_read_transactions: Verwenden Sie diese Option, um die Replikationsaufholung gegenüber der Leseverzögerung zu priorisieren, wenn die Verzögerung die Grenzwerte überschreitet.
SQL-Ausführungsstatistiken Informationen pro Abfrage (Top 50) nach verstrichener Gesamtzeit Listet die 50 wichtigsten Abfragen auf, bei denen während der beiden Snapshots die meiste Zeit verstrichen ist, sowie die Gesamtzahl der Ausführungen, aufgeschlüsselt nach Nutzer und Datenbank, in der die Abfrage ausgegeben wurde.
Elapsed time = Difference of total_exec_time in pg_stat_statements at the two snapshot time
In diesem Abschnitt können Sie die Abfrage mit der höchsten Last ermitteln, die die meiste Systemzeit in Anspruch nimmt.
Informationen pro Abfrage (Top 50) nach E/A-Lesevorgängen Listet die 50 wichtigsten Abfragen auf, bei denen während der beiden Snapshots die meiste Zeit für E/A-Lesevorgänge aufgewendet wurde, sowie die Anzahl der Ausführungen, Puffer-Treffer und Blocklesevorgänge, sowohl insgesamt als auch im Durchschnitt.
ReadIO = blk_read_time + temp_blk_read_time akkumuliert während der beiden Snapshots
Buffer Hits = shared_blks_hit + local_blks_hit akkumuliert während der beiden Snapshots
Buffer Reads = shared_blks_read + local_blks_read akkumuliert während der beiden Snapshots
Diese Felder werden standardmäßig von AlloyDB verfolgt, da track_io_timing festgelegt ist.
In diesem Abschnitt können Sie E/A-intensive Abfragen ermitteln, insbesondere wenn sie häufig von Laufwerken lesen müssen.
Informationen pro Abfrage (Top 50) nach Standardabweichung der verstrichenen Zeit Listet die 50 wichtigsten Abfragen mit der höchsten Standardabweichung der verstrichenen Zeit auf und enthält die Standardabweichungen, die sowohl zum Zeitpunkt des Beginns als auch zum Zeitpunkt des Endes des Snapshots berechnet wurden.
Hier bezieht sich der Wert auf stddev_exec_time aus pg_stat_statements
Bei einer Abfrage mit einer hohen Standardabweichung variiert die Ausführungszeit der Abfrage stark. Es ist möglicherweise an der Zeit, sich die E/A anzusehen.

Beschränkungen

  • Um eine übermäßige Speichernutzung und damit eine Speicherplatzverschwendung zu vermeiden, können Sie manuell maximal 2.500 Snapshots auf einer Instanz erstellen.

  • Wenn die Anzahl der Snapshots das Snapshot-Limit überschreitet, löscht AlloyDB alle manuellen Snapshots, die älter als 90 Tage sind. Um das Snapshot-Limit nicht zu überschreiten, müssen Sie unnötige Snapshots löschen, bevor Sie einen neuen erstellen.

  • AlloyDB löscht regelmäßig manuelle Snapshots, die älter als 90 Tage sind.

Nächste Schritte