Wie lange dauert ein Vakuum- / Autovakuum-Vorgang?


18

Ich verwalte eine große Datenbank (einige Hundert Konzerte) mit Tabellen mit verschiedenen Rollen, von denen einige Millionen Datensätze enthalten. Einige Tabellen empfangen nur eine große Anzahl von Einfügungen und Löschungen, andere wenige Einfügungen und eine große Anzahl von Aktualisierungen.

Die Datenbank läuft unter PostgreSQL 8.4 auf einem Debian 6.0 amd64-System mit 16 Gigabyte RAM.

Die Frage ist manchmal Autovakuum-Prozess auf einem Tisch, dauert sehr lange (Tage) zu vervollständigen. Ich möchte ungefähr sagen können, wie viel Zeit ein bestimmter Vakuumbefehl in Anspruch nimmt, um entscheiden zu können, ob er abgebrochen werden soll oder nicht. Auch wenn es eine Fortschrittsanzeige für Vakuumoperationen nach dem Tod gäbe, wäre dies sehr hilfreich.

Bearbeiten:

Ich suche keine kugelsichere Lösung. Lediglich ein grober Hinweis auf die Anzahl der toten Tupel oder der erforderlichen E / A-Bytes reicht aus, um eine Entscheidung zu treffen. Es ist wirklich ärgerlich, keine Ahnung zu haben, wann VACUUMes zu Ende geht.

Ich habe gesehen, dass pg_catalog.pg_stat_all_tableseine Spalte für die Anzahl der toten Tupel hat. So ist es möglich, eine Schätzung zu haben, auch wenn dies bedeutet, dass man ANALYZEvorher an den Tisch muss. Andererseits autovacuum_vacuum_thresholdund autovacuum_vacuum_scale_factorEinstellungen alleine beweisen, dass postgres selbst etwas über das Ausmaß der Änderungen auf den Tischen weiß und es wahrscheinlich auch in die Hände des DBA legt.

Ich bin nicht sicher, welche Abfrage ausgeführt werden soll, da ich beim Ausführen VACUUM VERBOSEsehe, dass nicht nur Tabellen, sondern auch Indizes für sie verarbeitet werden.

Antworten:


34

Auf meinem PostgreSQL (8.3) verwende ich diesen Trick:

  1. Ich erhalte die Plattengröße der Tabelle mit pg_total_relation_size()- dies schließt Indizes und die Größe von TOAST ein, was auch VACUUMverarbeitet wird. Dies gibt mir die Vorstellung, wie viele Bytes das VACUUMlesen muss.
  2. Ich renne VACUUMauf den Tisch.
  3. Ich finde das piddes VACUUMProzesses (in pg_catalog.pg_stat_activity).
  4. In der Linux-Shell starte ich while true; do cat /proc/123/io | grep read_bytes; sleep 60; done(wo 123ist die PID) - dies zeigt mir die Bytes, die der Prozess bisher von der Festplatte gelesen hat.

Dies gibt mir eine ungefähre Vorstellung davon, wie viele Bytes pro Minute von der verarbeitet (gelesen) werden VACUUM. Ich gehe davon aus, dass das VACUUMdie ganze Tabelle durchlesen muss (inklusive Indizes und TOAST), deren Plattengröße ich aus dem 1. Schritt kenne.

Ich gehe davon aus, dass die Tabelle groß genug ist, damit der Großteil der Seiten von der Festplatte gelesen werden muss (sie sind im gemeinsamen Postgres-Speicher nicht vorhanden). Das read_bytesFeld ist also gut genug, um als Fortschrittszähler verwendet zu werden.

Jedes Mal, wenn ich dies tat, betrug die Gesamtzahl der durch den Prozess gelesenen Bytes nicht mehr als 5% der Gesamtzahl der Relationen. Ich denke, dieser Ansatz ist für Sie gut genug.


Nasty :) Funktioniert das auch für spätere Versionen? Und, was noch wichtiger ist, für das automatische Vakuum?
Dezso

Ich habe es nicht für neuere Versionen ausprobiert. Es sollte für VACUUM FULL9.0+ funktionieren, da die Tabelle komplett neu geschrieben wird. Es sollte auch normal funktionieren VACUUM, aber ich habe es noch nicht getestet. Denn autovacuumes würde funktionieren, wenn Sie in der Lage wären, den Autovakuum-Worker-Prozess an einem bestimmten Tisch abzufangen, aber ich weiß nicht, wie Sie dies erreichen können.
Roman Hocke

Haben Sie Vorschläge, wie Sie dies mit RDS erreichen können? Natürlich haben wir bei der Verwendung von RDS keinen Zugriff auf eine Linux-Shell, aber wir möchten dies auch sehr gerne einschätzen können.
jwg2s

@ jwg2s Was meinst du mit "RDS", bitte? Datenbankdienste von Amazon? Wenn ja, bin ich leider nicht damit vertraut :-( Vielleicht würde ihre Unterstützung helfen.
Roman Hocke

1
Scheint auch auf PG 10 mit vollem Vakuum gut zu funktionieren.
DylanYoung

9

Dies ist sehr schwer zu bestimmen. Sie können das automatische Staubsaugen so einstellen , dass es aggressiver oder milder ist. Bei der Einstellung "Mild" und einem Rückstand und einer zu hohen E / A-Grundlast kann es jedoch vorkommen, dass der Prozess niemals einen ordnungsgemäßen Staubsaugerzustand erreicht - dann läuft der Prozess und läuft und läuft. Darüber hinaus haben spätere PostreSQL-Editionen deutlich verbesserte Autovakuum-Funktionen. Dies allein kann ausreichen, um auf eine dieser Editionen umzusteigen (vorzugsweise 9.2 als die aktuellste).

Der Fortschrittsbalken hört sich gut an, aber ich stelle mir vor, dass es nicht so einfach ist, ihn sinnvoll zu implementieren. Da Sie Ihre Tische ständig belasten, ist es durchaus möglich, dass der Fortschritt offensichtlich rückläufig ist (ich meine, dass die Anzahl der toten Reihen / der Prozentsatz zunimmt, anstatt abzunehmen). Welche Schlussfolgerung ziehen Sie dann?


2
Ich ziehe es vor, eine Art Fortschrittsanzeige zu sehen, auch wenn sie rückwärts geht, und nicht nichts.
Zaadeh

3
VACUUM ANALYZE VERBOSEGibt zumindest eine Aktivität auf der Konsole aus, wenn dies der Fall ist. Es ist besser, als nur auf eine statische Eingabeaufforderung zu starren und sich zu fragen, ob etwas stundenlang feststeckt.
Fake Name

Bei der Frage geht es um "Vakuum / Autovakuum". Das obige ist nur nützlich VACUUM, nicht für Autovakuum, aber es ist immer noch etwas.
Fake Name

@FakeName Eh, ich habe die Frage falsch verstanden - habe den manuellen Vakuumteil verpasst. Entschuldigung, ich lösche meinen Kommentar.
Dezso

3

In unserer Produktion hatte einer der größten Tische dieses Protokoll:

pages: 0 removed, 1801722 remain
tuples: 238912 removed, 42582083 remain, 1396 are dead but not yet removable
buffer usage: 9477565 hits, 3834218 misses, 2220101 dirtied
avg read rate: 2.976 MB/s, avg write rate: 1.723 MB/s
system usage: CPU 68.47s/177.49u sec elapsed 10065.08 sec

Dies ist mit Abstand der schlechteste Ressourcenverbrauch, alle anderen Tabellen haben weniger als 2 s gedauert.

Um diese Arten von Protokollen anzuzeigen, sollten Sie Folgendes ausführen:

alter system set log_autovacuum_min_duration TO 5; 

(für 5 ms), laden Sie die Konfigurationsdatei neu.


3

Ich fand diesen Beitrag und diesen Beitrag hilfreich, aber wie andere erwähnt haben, kann es schwierig sein, den Gesamtfortschritt des Vakuums zu berechnen, da der Prozess einige separate Vorgänge umfasst.

Ich verwende diese Abfrage, um den Fortschritt des Scannens des Vakuumtisches zu überwachen. Dies scheint der Hauptteil der Arbeit zu sein:

SELECT heap_blks_scanned/cast(heap_blks_total as numeric)*100 as heap_blks_percent, progress.*, activity.query
FROM pg_stat_progress_vacuum AS progress
INNER JOIN pg_stat_activity AS activity ON activity.pid = progress.pid;

Dies schließt jedoch nicht das anschließende Index-Scannen ein und kann ebenso lange dauern, wenn nicht länger, wenn Sie über eine Tonne Indizes verfügen. Leider kann ich das Index-Scannen / -Staubsaugen nicht überwachen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.