Wie kann ich Probleme mit hoher oder voller Festplattenauslastung mit Amazon Redshift beheben?

Lesedauer: 9 Minute
0

Ich habe eine hohe oder vollständige Festplattenauslastung auf Amazon Redshift und möchte dieses Problem beheben.

Lösung

Fehler bei hoher Festplattenauslastung können von verschiedenen Faktoren abhängen, darunter:

  • Verteilungs- und Sortierschlüssel
  • Bearbeitung von Abfragen
  • Tabellen mit VARCHAR(MAX)-Spalten
  • Hohe Spaltenkomprimierung
  • Wartungsarbeiten
  • Kartesische Produkte mit Kreuzverbindungen
  • Minimale Tabellengröße
  • Tombstone-Blöcke
  • Kopieren einer großen Datei

Verteilungs- und Sortierschlüssel

Überprüfen Sie den Verteilungsstil, den Verteilungsschlüssel und die Sortierschlüsselauswahl der Tabelle. Tabellen mit Verteilungsverzerrungen – d. h. in einem Knoten befinden sich mehr Daten als in den anderen – können zu einem vollen Festplattenknoten führen. Wenn Sie Tabellen mit schiefen Verteilungsstilen haben, ändern Sie den Verteilungsstil in eine gleichmäßigere Verteilung. Beachten Sie, dass Verteilung und Zeilenversatz sich auf den Speicherversatz und das Zwischenzeilensatz auswirken können, wenn eine Abfrage ausgeführt wird. Weitere Informationen zu Verteilungs- und Sortierschlüsseln finden Sie im Advanced Table Design Playbook von Amazon Redshift Engineering: Präambel, Voraussetzungen und Priorisierung.

Führen Sie die folgende Abfrage aus, um die Kardinalität Ihres Verteilungsschlüssels zu ermitteln:

SELECT <distkey column>, COUNT(*) FROM <schema name>.<table with distribution skew> GROUP BY <distkey column> HAVING COUNT(*) > 1 ORDER BY 2 DESC;

Hinweis: Um einen Sortierschritt zu vermeiden, verwenden Sie SORT KEY -Spalten in Ihrer ORDER BY-Klausel. Ein Sortierschritt kann zu viel Speicherplatz beanspruchen und zu einem unnötigen Festplattenüberlauf führen. Weitere Informationen finden Sie unter Arbeiten mit Sortierschlüsseln.

Wählen Sie im gefilterten Ergebnissatz eine Spalte mit hoher Kardinalität aus, um deren Datenverteilung anzuzeigen. Weitere Informationen zum Verteilungsstil Ihrer Tabelle finden Sie unter Auswählen des besten Verteilungsstils.

Verwenden Sie das Hilfsprogramm Amazon Redshift-Tool table\ _inspector.sql, um zu sehen, wie Datenbankblöcke in einem Verteilungsschlüssel einem Cluster zugeordnet werden.

Bearbeitung von Abfragen

Überprüfen Sie den Speicher, der einer Abfrage zugewiesen ist. Während der Verarbeitung einer Abfrage können Zwischenabfrageergebnisse in temporären Blöcken gespeichert werden. Wenn nicht genügend freier Speicher zur Verfügung steht, führen die Tabellen zu einem Festplattenüberlauf. Zwischenergebnissätze werden nicht komprimiert, was sich auf den verfügbaren Speicherplatz auswirkt. Weitere Informationen finden Sie unter Für die Abfrage unzureichend zugewiesener Speicher.

Amazon Redshift verwendet standardmäßig eine Tabellenstruktur mit gleichmäßiger Verteilung und ohne Spaltenkodierung für temporäre Tabellen. Wenn Sie jedoch die SELECT... INTO-Syntax verwenden, verwenden Sie eine CREATE-Anweisung. Weitere Informationen finden Sie unter Die 10 wichtigsten Techniken zur Leistungsoptimierung für Amazon Redshift. Folgen Sie den Anweisungen unter Tipp 6: Beheben Sie die ineffiziente Verwendung temporärer Tabellen.

Wenn Ihrer Abfrage nicht genügend Speicher zugewiesen ist, sehen Sie möglicherweise einen Schritt in SVL\ _QUERY\ _SUMMARY, in dem is\ _diskbased den Wert „true“ anzeigt. Um dieses Problem zu beheben, erhöhen Sie die Anzahl der Abfrageslots, um der Abfrage mehr Speicher zuzuweisen. Weitere Informationen zum vorübergehenden Erhöhen der Slots für eine Abfrage finden Sie unter wlm\ _query\ _slot\ _count oder Optimieren des WLM, um gemischte Workloads auszuführen. Sie können auch Regeln zur WLM-Abfrageüberwachung verwenden, um hohen Verarbeitungslasten entgegenzuwirken und I/O-intensive Abfragen zu identifizieren.

Tabellen mit VARCHAR(MAX)-Spalten

Überprüfen Sie die Spalten VARCHAR oder CHARACTER VARIING auf nachstehende Leerzeichen, die möglicherweise weggelassen werden, wenn Daten auf der Festplatte gespeichert werden. Während der Abfrageverarbeitung können nachstehende Leerzeichen die volle Länge des Speichers einnehmen (der Maximalwert für VARCHAR ist 65535). Es hat sich bewährt, die kleinstmögliche Spaltengröße zu verwenden.

Führen Sie die folgende Abfrage aus, um eine Liste von Tabellen mit maximalen Spaltenbreiten zu generieren:

SELECT database, schema || '.' || "table" AS "table", max_varchar FROM svv_table_info WHERE max_varchar > 150 ORDER BY 2;

Führen Sie die folgende Abfrage aus, um die wahren Breiten der breiten VARCHAR-Tabellenspalten zu ermitteln und anzuzeigen:

SELECT max(octet_length (rtrim(column_name))) FROM table_name;

Überprüfen Sie in der Ausgabe dieser Abfrage, ob die Länge für Ihren Anwendungsfall geeignet ist. Wenn die Spalten die maximale Länge haben und Ihre Anforderungen übertreffen, passen Sie ihre Länge an die benötigte Mindestgröße an.

Weitere Informationen zum Tabellendesign finden Sie in den Best Practices von Amazon Redshift für das Entwerfen von Tabellen.

Hohe Spaltenkomprimierung

Kodieren Sie alle Spalten (außer dem Sortierschlüssel) mithilfe von ANALYZE COMPRESSION oder mithilfe der automatischen Tabellenoptimierungsfunktion in Amazon Redshift. Amazon Redshift bietet Spaltenkodierung. Es ist eine bewährte Methode, diese Funktion zu verwenden, obwohl sie die Leseleistung erhöht und den Gesamtspeicherverbrauch reduziert.

Wartungsarbeiten

Stellen Sie sicher, dass die Datenbanktabellen in Ihrer Amazon Redshift-Datenbank regelmäßig analysiert und gescannt werden. Identifizieren Sie alle Abfragen, die für Tabellen ausgeführt werden, für die Statistiken fehlen. Wenn verhindert wird, dass Abfragen für Tabellen ausgeführt werden, für die Statistiken fehlen, scannt Amazon Redshift nicht benötigte Tabellenzeilen. Dies hilft auch, Ihre Abfrageverarbeitung zu optimieren.

Hinweis: Wartungsvorgänge wie VACUUM und DEEP COPY verwenden temporären Speicherplatz für ihre Sortiervorgänge, sodass mit einem Anstieg der Festplattenauslastung zu rechnen ist.

Die folgende Abfrage hilft Ihnen beispielsweise dabei, veraltete Statistiken in Amazon Redshift zu identifizieren:

SELECT * FROM svv_table_info WHERE stats_off > 10 ORDER BY size DESC;

Verwenden Sie zusätzlich den Befehl ANALYZE, um Tabellenstatistiken anzuzeigen und zu analysieren.

Weitere Informationen zu Wartungsvorgängen finden Sie im Amazon Redshift Analyze & Vacuum Schema Utility.

Kartesische Produkte mit Kreuzverbindungen

Verwenden Sie den EXPLAIN-Plan der Abfrage, um nach Abfragen mit kartesischen Produkten zu suchen. Kartesische Produkte sind Querverknüpfungen, die nichts miteinander zu tun haben und zu einer erhöhten Anzahl von Blöcken führen können. Diese Querverknüpfungen können zu einer höheren Speichernutzung und mehr Tabellen führen, die auf die Festplatte übertragen werden. Wenn Querverknüpfungen keine JOIN-Bedingung gemeinsam haben, erzeugen die Verknüpfungen ein kartesisches Produkt zweier Tabellen. Jede Zeile einer Tabelle wird dann mit jeder Zeile der anderen Tabelle verbunden.

Querverknüpfungen können auch als verschachtelte Schleifenverknüpfungen ausgeführt werden, deren Verarbeitung am längsten dauert. Verschachtelte Schleifenverknüpfungen führen zu Spitzenwerten bei der gesamten Festplattennutzung. Weitere Informationen finden Sie unter Identifizieren von Abfragen mit verschachtelten Schleifen.

Minimale Tabellengröße

Dieselbe Tabelle kann in verschiedenen Clustern unterschiedliche Größen haben. Die minimale Tabellengröße wird dann von der Anzahl der Spalten bestimmt und davon, ob die Tabelle einen SORTKEY und die Anzahl der aufgefüllten Segmente enthält. Wenn Sie kürzlich die Größe eines Amazon Redshift-Clusters geändert haben, sehen Sie möglicherweise eine Änderung in Ihrem gesamten Festplattenspeicher. Dies wird durch die Änderung der Anzahl der Segmente verursacht. Amazon Redshift zählt auch die Tabellensegmente, die von jeder Tabelle verwendet werden. Weitere Informationen finden Sie unter Warum verbraucht eine Tabelle in einem Amazon Redshift-Cluster mehr oder weniger Festplattenspeicher als erwartet?

Tombstone-Blöcke

Tombstone-Blöcke werden generiert, wenn eine WRITE-Transaktion an eine Amazon Redshift-Tabelle stattfindet und gleichzeitig ein Lesevorgang erfolgt. Amazon Redshift speichert die Blöcke vor dem Schreibvorgang, um einen gleichzeitigen Lesevorgang konsistent zu halten. Amazon Redshift-Blöcke können nicht geändert werden. Jede Aktion Einfügen, Aktualisieren oder Löschen erstellt eine neue Gruppe von Blöcken und markiert die alten Blöcke als veraltet.

Manchmal werden Tombstones in der Commit-Phase aufgrund von Tabellentransaktionen mit langer Laufzeit nicht gelöscht. Tombstones können auch nicht gelöscht werden, wenn zu viele ETL-Loads gleichzeitig ausgeführt werden. Da Amazon Redshift die Datenbank ab dem Zeitpunkt überwacht, an dem die Transaktion beginnt, behält jede Tabelle, die in die Datenbank geschrieben wird, auch die Tombstone-Blöcke bei. Wenn Tabellentransaktionen mit langer Laufzeit regelmäßig und über mehrere Lasten hinweg stattfinden, können sich so viele Tombstones ansammeln, dass der Fehler „Disk Full“ angezeigt wird.

Sie können Amazon Redshift auch zwingen, die Analyse von Tombstone-Blöcken durchzuführen, indem Sie einen Commit-Befehl ausführen.

Wenn Abfragen mit langer Laufzeit aktiv sind, beenden Sie die Abfragen (und geben Sie alle nachfolgenden Blöcke frei), indem Sie den Befehl commit verwenden:

begin;
create table a (id int);
insert into a values(1);
commit;
drop table a;

Führen Sie dann die folgende Abfrage aus, um Tombstone-Blöcke zu bestätigen:

select trim(name) as tablename, count(case when tombstone > 0 then 1 else null end) as tombstones from svv_diskusage group by 1 having count(case when tombstone > 0 then 1 else null end) > 0 order by 2 desc;

Kopieren einer großen Datei

Während eines COPY-Vorgangs wird möglicherweise der Fehler Disk Full angezeigt, auch wenn genügend Speicherplatz verfügbar ist. Dieser Fehler tritt auf, wenn der Sortiervorgang auf die Festplatte übertragen wird und temporäre Blöcke erstellt werden.

Wenn die Fehlermeldung Disk Full angezeigt wird, überprüfen Sie die Tabelle STL\ _DISK\ _FULL\ _DIAG. Prüfen Sie, welche Abfrage-ID den Fehler verursacht hat und welche temporären Blöcke erstellt wurden:

select '2000-01-01'::timestamp + (currenttime/1000000.0)* interval '1 second' as currenttime,node_num,query_id,temp_blocks from pg_catalog.stl_disk_full_diag;

Weitere bewährte Methoden finden Sie unter Bewährte Methoden für Amazon Redshift zum Laden von Daten.

Zusätzliche Problembehebung

Überprüfen Sie den Prozentsatz des Festplattenspeichers auf der Registerkarte Leistung in der Amazon Redshift-Konsole. Für jeden Clusterknoten stellt Amazon Redshift zusätzlichen Festplattenspeicher bereit, der größer ist als die nominale Festplattenkapazität.

Wenn Sie einen plötzlichen Anstieg der Auslastung feststellen, verwenden Sie STL\ _QUERY, um die Aktivitäten und Jobs zu identifizieren, die gerade ausgeführt werden. Beachten Sie, welche Abfragen zum Zeitpunkt eines Festplattenüberlaufs ausgeführt werden:

select * from stl_query where starttime between '2018-01-01 00:30:00' and '2018-01-01 00:40:00';

Hinweis: Aktualisieren Sie die Werte mit der Uhrzeit, zu der die Spitze aufgetreten ist.

Führen Sie die folgende Abfrage aus, um die 20 häufigsten Festplattenüberlaufabfragen zu ermitteln:

select A.userid, A.query, blocks_to_disk, trim(B.querytxt) text from stl_query_metrics A, stl_query B where A.query = B.query and segment=-1 and step = -1 and max_blocks_to_disk > 0 order by 3 desc limit 20;

Sehen Sie sich den Spaltenwert blocks\ _to\ _disk an, um den Festplattenüberlauf zu identifizieren. Beenden Sie Anfragen, die Überläufe verursachen, falls erforderlich. Weisen Sie den Abfragen dann zusätzlichen Speicher zu, bevor Sie sie erneut ausführen. Weitere Informationen finden Sie unter STL\ _QUERY\ _METRICS.

Führen Sie die folgende Abfrage aus, um festzustellen, ob Ihre Abfragen ordnungsgemäß auf eine Festplatte geschrieben werden:

SELECT q.query, trim(q.cat_text)
FROM (
SELECT query,
replace( listagg(text,' ') WITHIN GROUP (ORDER BY sequence), '\\n', ' ') AS cat_text
FROM stl_querytext
WHERE userid>1
GROUP BY query) q
JOIN (
SELECT distinct query
FROM svl_query_summary
WHERE is_diskbased='t' AND (LABEL ILIKE 'hash%' OR LABEL ILIKE 'sort%' OR LABEL ILIKE 'aggr%' OR LABEL ILIKE 'save%' OR LABEL ILIKE 'window%' OR LABEL ILIKE 'unique%')
AND userid > 1) qs
ON qs.query = q.query;

Dieser Befehl identifiziert auch Abfragen, die auf die Festplatte übertragen werden.


Verwandte Informationen

Leistung

Amazon Redshift-Systemübersicht

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr