Ich versuche, PostgreSQL dazu zu bringen, meine Datenbank aggressiv automatisch zu vakuumieren. Ich habe das automatische Vakuum derzeit wie folgt konfiguriert:
- autovacuum_vacuum_cost_delay = 0 #Kostenbasiertes Vakuum ausschalten
- autovacuum_vacuum_cost_limit = 10000 #Max value
- autovacuum_vacuum_threshold = 50 # Standardwert
- autovacuum_vacuum_scale_factor = 0.2 # Standardwert
Ich stelle fest, dass das automatische Vakuum nur aktiviert wird, wenn die Datenbank nicht geladen ist, sodass ich Situationen erlebe, in denen es weit mehr tote Tupel als lebende Tupel gibt. Ein Beispiel finden Sie im beigefügten Screenshot. Einer der Tische hat 23 lebende Tupel, aber 16845 tote Tupel warten auf Vakuum. Das ist verrückt!
Auto Vacuum wird aktiviert, wenn der Testlauf beendet ist und der Datenbankserver inaktiv ist. Dies ist nicht das, was ich möchte, da Auto Vacuum aktiviert werden soll, wenn die Anzahl der toten Tupel 20% der aktiven Tupel + 50 überschreitet, wie es die Datenbank getan hat konfiguriert. Das automatische Saugen im Leerlauf des Servers ist für mich unbrauchbar, da der Produktionsserver voraussichtlich über einen längeren Zeitraum hinweg 1000 Updates / Sek. Erreicht. Aus diesem Grund muss das automatische Saugen auch dann ausgeführt werden, wenn der Server ausgelastet ist.
Fehlt mir etwas? Wie kann ich das automatische Staubsaugen erzwingen, während der Server stark ausgelastet ist?
Aktualisieren
Könnte dies ein Sperrproblem sein? Bei den fraglichen Tabellen handelt es sich um Übersichtstabellen, die über einen After-Insert-Trigger aufgefüllt werden. Diese Tabellen sind im SHARE ROW EXCLUSIVE-Modus gesperrt, um gleichzeitiges Schreiben in dieselbe Zeile zu verhindern.
quelle
Das Erhöhen der Anzahl der Autovakuum-Prozesse und das Verringern der Naptime werden wahrscheinlich helfen. Hier ist die Konfiguration für ein PostgreSQL 9.1, das ich auf einem Server verwende, der Sicherungsinformationen speichert und infolgedessen viel Einfügeaktivität erhält.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Ich werde auch versuchen, die
cost_delay
zu senken , um das Staubsaugen aggressiver zu machen.Ich kann das automatische Staubsaugen auch mit pgbench testen.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Beispiel für eine hohe Konkurrenz:
Erstellen Sie die bench_replication-Datenbank
Führen Sie pgbench aus
Überprüfen Sie den automatischen Staubsaugerstatus
quelle
Vorhandenes "Qualify for Autovacuum" -Skript ist sehr nützlich, aber (wie korrekt angegeben) fehlten tabellenspezifische Optionen. Hier ist eine modifizierte Version davon, die diese Optionen berücksichtigt:
quelle