Lassen Sie uns das Vakuum ausschalten ?! Alexey Lesovsky

EntschlĂŒsselung des Berichts 2018 von Alexei Lesovsky „Lass uns das Vakuum ausschalten ?!“


Anmerkung des Herausgebers: Empfehlungen zum Ändern von Parametern sollten immer in anderen Berichten verglichen werden.


Ein solcher Aufruf tritt hĂ€ufig auf, wenn Probleme in PostgreSQL auftreten, und der HauptverdĂ€chtige ist vacuum(im Folgenden einfach "Vakuum"). Aus Erfahrung treten viele auf diesen Rechen, und meine Kollegen von Data Egret und ich mĂŒssen oft die Konsequenzen ziehen, weil dann alles schlimmer wird. Aber wenn Sie auf das Vakuum selbst achten, dann gibt es vielleicht keine solche Person, die Postgres verwenden wĂŒrde und gleichzeitig nichts ĂŒber ihn wusste. Immerhin beginnt die Geschichte des Vakuums vor relativ langer Zeit, und im Internet finden Sie viele alte und neue BeitrĂ€ge ĂŒber das Vakuum, lange Diskussionen auf den Mailinglisten. Trotz der Tatsache, dass das Thema Vakuum in der offiziellen Dokumentation zu PostgreSQL ausfĂŒhrlich beschrieben wird, werden weiterhin neue BeitrĂ€ge und neue Diskussionen erscheinen. Vielleicht sind deshalb viele Mythen, Geschichten, Horrorgeschichten und MissverstĂ€ndnisse mit dem Vakuum verbunden. Inzwischen ist Vakuum eine der wichtigsten Komponenten von PostgreSQL.und seine Arbeit wirkt sich direkt auf die ProduktivitĂ€t aus. Es ist unmöglich, in einem Bericht absolut alles ĂŒber das Vakuum zu erzĂ€hlen, aber ich möchte wichtige Punkte im Zusammenhang mit dem Vakuum aufzeigen, wie z. B. seine interne Struktur, die wichtigsten AnsĂ€tze fĂŒr die Abstimmung, die Überwachung der Leistung, die Überwachung und was zu tun ist, wenn das Vakuum die Hauptsache ist VerdĂ€chtiger aller Probleme. Nun, und natĂŒrlich möchte ich verbreitete Mythen und MissverstĂ€ndnisse, die mit dem Vakuum verbunden sind, zerstreuen.Ich möchte verbreitete Mythen und MissverstĂ€ndnisse im Zusammenhang mit dem Vakuum zerstreuen.Ich möchte verbreitete Mythen und MissverstĂ€ndnisse im Zusammenhang mit dem Vakuum zerstreuen.




! . : , . , . , . , - , .



, , , . , . , , , .



, , ?



: « , . - . , ».


? , . , , , – 100 % ( ). , . - .



, . postgres’ . , . , . , . . - .



, . - , , , . . .



- / : « , ». , . - .



, , , iotop , . - . . .


. . , .



? , - . . . .



- - : « . – autovacuum. ».



, , , : , . . .


, .


  • ( DBA) – , . , . , .
  • , . . . .
  • , shared buffers, ( , ), . . - , shared buffers.
  • . . – .


. . : https://github.com/lesovsky/ConferenceStuff/tree/master/2016.highload


? pgbench . pgbench . . , . . . , .



. , . , , , - . , Postgres, ( , ). , .



, MVCC.


MVCC (Multi-Version Concurrency Control) – "" , Postgres', . . .


  • . . .
  • .
  • , ; ( ).


? . . (snapshot).



: , . , ( COMMIT ROLLBACK).



COMMIT, , . , " ". : PostgreSQL.


. , . - , «delete», «update». .. "" — dead tuples.



. – xmin. , . . . insert, xmin .


, . xmax , .


delete. . — xmax , .


, "" . , xmax . — , Postgres , . - - , .. , .



, ? , , , .


. , . .



«delete», «update» , / . , , - .



, . .



, , , . .



:


  • , , , "", , .
  • shared buffers .
  • bloat , .. — .


. ?


  • -, .
  • Postgres, . . . , , - , .
  • . . .
  • – . . . , .


  • - . , Postgres . , . , .
  • , .
  • , . 32 , . 4294967296. , . , , ( ). .. to prevent wraparound vacuum, . wraparound vacuum — .
  • , , . - . . . , . , .


  • . Postgres , Postgres , , Pentium, - , . - . , , , , - . . .
  • Postgres . . 9.6. , 9.6 , 9.6. ( , Postgres 12)


- . .



-, , .. — cost-based vacuum. .


, : . , ( ) — . .


, . .


. vacuum_cost_page_hit, vacuum_cost_page_miss, vacuum_cost_page_dirty, hit, miss, dirty.


Hit – , , shared buffers, . . . , .


Miss – shared buffers . . , . , shared buffers, (page cache) - . , .


Dirty – , , . .


. vacuum_cost_limit. .


vacuum_cost_delay. , cost limit . cost delay .


, , , . . .



-, . - , , .


  • , 32 , . , , autovacuum_max_workers 10-15 % .
  • autovacuum_naptime. , . 60 . . , 1 . , . , – . . . . , .
  • – , vacuum_cost_limit, , , . , vacuum_cost_limit .


-, , . , . – .


. autovacuum_vacuum_scale_factor. scale factor . - scale_factor 0.2, . . 20 %.


autovacuum_vacuum_threshold. - – 50 . , , .



, - 20 %. , autovacuum_vacuum_threshold , , 1-2-5 %.



, autovacuum_vacuum_scale_factor . . , 1 % — . autovacuum_vacuum_scale_factor 0. autovacuum_vacuum_threshold, . . , , . autovacuum_vacuum_scale_factor , autovacuum_vacuum_threshold.



, . 4-5 , HDD , . HDD . , , . , , , .


SSD . SSD . , .


SSD . , . , (, ), . – , .


NVMe , , . I/O . , . , - – - . , IO, , .



- . vacuum_cost_delay vacuum_cost_limit. . . . . . . – . .


, . , , .



vacuum_cost_delay = 0
vacuum_cost_page_hit = 0
vacuum_cost_page_miss = 5
vacuum_cost_page_dirty = 5
vacuum_cost_limit = 200
--
autovacuum_max_workers = 10
autovacuum_naptime = 1s
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_delay = 5ms
autovacuum_vacuum_cost_limit = -1

SSD , . , , .


: SSD.



. - , - "" , .


, storage parameters. tablespaces, . , .



, — , , , Postgres. , , pgcompacttable pg_repack.


bloat .


, , . – , ( ). .



, . - .


Postgres , , .


pg_stat_activity. , (view) , , .


, , , . . . pg_stat_atctivity ().



, , . , prevent wraparound . (autovacuum_max_workers)– .


– . , , , . — . .



, , pg_stat_progress_vacuum 9.6. .


, , . pg_stat_activity , , , , pg_stat_progress_vacuum .



https://github.com/lesovsky/uber-scripts/blob/master/postgresql/sql/vacuum_activity.sql


, , , . , 50 % . 3 , 3 .


— : , . , .



:


  • . .
  • . cost-based, cost-.
  • – . , , .


! ! . 9.6 , . , , , . - ? , - ?


. 9.6 freeze-, . postgres’ , wraparound vacuum. , . , , . , , . , 9.5 . , . , .


, buffer cache, read?


, autovacuum worker , buffer-. 32 , -. , .


?


, , buffer cache, page cache, , . . , page cache, shared buffers .


, ! , . , . time . 5 1 , . . , 5 100 % CPU, storage. .


– . – . CPU, - . – ? Ubuntu. Ubuntu powersave. . ., , 3,4 GHz, – 1,2. . performance . . , , , , , , . , , .


. , , . . - , . - bloat - , . .


! , . : . - autovacuum_vacuum_scale_factor autovacuum_vacuum_threshold . , , , . , naptime , analyze. Postgres . pg_class reltuples


.


. .


.


dead tuples community , 2ndQuadrant. – . analyze reltuples .


, . – . . , «idle in transactions», , . - . , . . , .


, ?


, MVCC . - , .


reltuples?


. .


( ) . , . : update, insert . . : , . tuples. .


, . . , . . reltuples . , , , , . . . - – . .


, . - ?


Der Postgres-Code enthĂ€lt separate Funktionen, mit denen Statistiken ĂŒber die Verteilung von Daten in Tabellen erfasst werden. Dies ist ein separates Autovakuum-Subsystem. Es liest Beispieldaten begrenzter GrĂ¶ĂŸe aus der Tabelle. Und auf dieser Grundlage baut sich die Verteilung von Daten auf. Und er speichert diese Informationen im Systemkatalog pg_statisticoder in der Systemansicht pg_stats. Wenn der Planer AbfrageplĂ€ne erstellt, liest er Informationen aus diesem Verzeichnis. Und macht auf seiner Basis PlĂ€ne. Und dann wĂ€hlt er den besten.


All Articles