Optimalizace automatického úklidu na jednoúčelovém serveru Azure Database for PostgreSQL

PLATÍ PRO: Azure Database for PostgreSQL – Jednoúčelový server

Důležité

Jednoúčelový server Azure Database for PostgreSQL je na cestě vyřazení. Důrazně doporučujeme upgradovat na flexibilní server Azure Database for PostgreSQL. Další informace o migraci na flexibilní server Azure Database for PostgreSQL najdete v tématu Co se děje s jednoúčelovým serverem Azure Database for PostgreSQL?

Tento článek popisuje efektivní optimalizaci automatického úklidu na serveru Azure Database for PostgreSQL.

Přehled automatického úklidu

PostgreSQL využívá řízení souběžnosti více verzí (MVCC) a umožňuje tak větší souběžnost databáze. Každá aktualizace má za následek vložení a odstranění a každé odstranění má za následek označení řádků k obnovitelnému odstranění. Softwarové označení identifikuje neaktivní řazené kolekce členů, které se vyprázdní později. K provedení těchto úloh spustí PostgreSQL úlohu vakua.

Úlohu vakua je možné aktivovat ručně nebo automaticky. Při náročných operacích aktualizace nebo odstranění databáze existuje více řazených řazených kolekcí členů. Při nečinnosti databáze existuje méně mrtvých řazených kolekcí členů. Pokud je zatížení databáze náročné, potřebujete ho vysávat častěji, což ručně znesvědčuje spouštění úloh vakua.

Autovacuum je možné nakonfigurovat a využívat výhod ladění. Výchozí hodnoty, které PostgreSQL dodává s cílem zajistit, aby produkt fungoval na všech typech zařízení. Mezi tato zařízení patří Raspberry Pis. Ideální hodnoty konfigurace závisí na:

  • K dispozici jsou celkové dostupné prostředky, například skladová položka a velikost úložiště.
  • Využití prostředků
  • Vlastnosti jednotlivých objektů.

Výhody automatického úklidu

Pokud čas od času nevysadíte, můžou mrtvé řazené kolekce členů, které se hromadí, způsobit následující:

  • Data bloudí, například větší databáze a tabulky.
  • Větší neoptimální indexy.
  • Zvýšení vstupně-výstupních operací.

Monitorování bloudu pomocí dotazů autovacuum

Následující ukázkový dotaz je navržený tak, aby identifikoval počet mrtvých a živých řazených kolekcí členů v tabulce s názvem XYZ:

SELECT relname,
       n_dead_tup,
       n_live_tup,
       (n_dead_tup / n_live_tup) AS DeadTuplesRatio,
       last_vacuum,
       last_autovacuum
FROM pg_catalog.pg_stat_all_tables
WHERE relname = 'XYZ'
ORDER BY n_dead_tup DESC;

Konfigurace automatického úklidu

Parametry konfigurace, které řídí automatické úklidy, jsou založené na odpovědích na dvě klíčové otázky:

  • Kdy má začít?
  • Kolik by mělo být vyčištěno po zahájení?

Tady jsou některé parametry konfigurace automatického úklidu, které můžete aktualizovat na základě předchozích otázek, spolu s některými pokyny.

Parametr Description Default value
autovacuum_vacuum_threshold Určuje minimální početaktualizovaných Výchozí hodnota je 50 řazených kolekcí členů. Tento parametr nastavte pouze v souboru postgresql.conf nebo na příkazovém řádku serveru. Pokud chcete přepsat nastavení jednotlivých tabulek, změňte parametry úložiště tabulek. 50
autovacuum_vacuum_scale_factor Určuje zlomek velikosti tabulky, která se má přidat do autovacuum_vacuum_threshold při rozhodování, jestli se má aktivovat operace vakua. Výchozí hodnota je 0,2, což je 20 procent velikosti tabulky. Tento parametr nastavte pouze v souboru postgresql.conf nebo na příkazovém řádku serveru. Pokud chcete přepsat nastavení jednotlivých tabulek, změňte parametry úložiště tabulek. 0,2
autovacuum_vacuum_cost_limit Určuje hodnotu limitu nákladů použitou v automatických vakuových operacích. Pokud je zadána hodnota -1, což je výchozí hodnota, použije se běžná hodnota vacuum_cost_limit. Pokud existuje více než jeden pracovní proces, hodnota se distribuuje úměrně mezi spuštěné pracovní procesy automatického úklidu. Součet limitů pro každý pracovní proces nepřekračuje hodnotu této proměnné. Tento parametr nastavte pouze v souboru postgresql.conf nebo na příkazovém řádku serveru. Pokud chcete přepsat nastavení jednotlivých tabulek, změňte parametry úložiště tabulek. -1
autovacuum_vacuum_cost_delay Určuje hodnotu zpoždění nákladů použitou v automatických operacích vakua. Pokud je zadán parametr -1, použije se běžná hodnota vacuum_cost_delay. Výchozí hodnota je 20 milisekund. Tento parametr nastavte pouze v souboru postgresql.conf nebo na příkazovém řádku serveru. Pokud chcete přepsat nastavení jednotlivých tabulek, změňte parametry úložiště tabulek. 20 ms
autovacuum_naptime Určuje minimální prodlevu mezi spuštěním automatického úklidu v libovolné dané databázi. V každém kole démon zkoumá databázi a podle potřeby vydává příkazy VACUUM a ANALYZE pro tabulky v této databázi. Zpoždění se měří v sekundách. Tento parametr nastavte pouze v souboru postgresql.conf nebo na příkazovém řádku serveru. 15 s
autovacuum_max_workers Určuje maximální počet procesů automatického úklidu, kromě spouštěče automatického úklidu, který může běžet najednou. Výchozí hodnota je tři. Tento parametr nastavte pouze na začátku serveru. 3

Pokud chcete přepsat nastavení jednotlivých tabulek, změňte parametry úložiště tabulek.

Náklady na automatické úklidy

Tady jsou "náklady" na provoz vakuové operace:

  • Datové stránky, na které se úklid spouští, jsou uzamčeny.
  • Výpočetní prostředky a paměť se používají při spuštění úlohy vakua.

V důsledku toho nespustíte úlohy vakua příliš často nebo příliš zřídka. Úloha vakua se musí přizpůsobit úloze. Otestujte všechny změny parametru autovacuum z důvodu kompromisů každého z nich.

Trigger spuštění automatického úklidu

Funkce Autovacuum se aktivuje, když počet mrtvých řazených kolekcí členů překročí autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * reltuples. Tady je reltuples konstanta.

Vyčištění z automatického úklidu musí držet krok s zatížením databáze. Jinak může dojít k výpadku úložiště a obecné zpomalení dotazů. Amortizovaná v průběhu času, rychlost, s jakou operace úklidu vyčistí mrtvé řazené řazené kolekce členů, by se měla rovnat frekvenci vytváření mrtvých řazených kolekcí členů.

Databáze s mnoha aktualizacemi a odstraněními mají více řazených kolekcí členů a potřebují více místa. Obecně platí, že databáze s mnoha aktualizacemi a odstraněními využívají nízké hodnoty autovacuum_vacuum_scale_factor a autovacuum_vacuum_threshold. Nízké hodnoty brání dlouhodobé akumulace mrtvých řazených kolekcí členů. U obou parametrů s menšími databázemi můžete použít vyšší hodnoty, protože nutnost vakuování je méně naléhavé. Časté úklidy jsou spojené s náklady na výpočetní prostředky a paměť.

Výchozí měřítko 20 procent funguje dobře u tabulek s nízkým procentem řazených kolekcí členů. Nefunguje dobře u tabulek s vysokým procentem mrtvých řazených kolekcí členů. Například u tabulky o velikosti 20 GB se tento faktor škálování přeloží na 4 GB mrtvých řazených kolekcí členů. V tabulce o velikosti 1 TB je to 200 GB mrtvých řazených kolekcí členů.

Pomocí PostgreSQL můžete tyto parametry nastavit na úrovni tabulky nebo na úrovni instance. V současné době můžete tyto parametry nastavit na úrovni tabulky pouze ve službě Azure Database for PostgreSQL.

Odhad nákladů na autovacuum

Spouštění automatického úklidu je "nákladné" a existují parametry pro řízení běhu vakuových operací. Následující parametry pomáhají odhadnout náklady na provoz vakua:

  • vacuum_cost_page_hit = 1
  • vacuum_cost_page_miss = 10
  • vacuum_cost_page_dirty = 20

Vakuový proces čte fyzické stránky a kontroluje mrtvé řazené kolekce členů. Každá stránka v shared_buffers se považuje za cenu 1 (vacuum_cost_page_hit). Všechny ostatní stránky jsou považovány za náklady 20 (vacuum_cost_page_dirty), pokud existují mrtvé řazené kolekce členů, nebo 10 (vacuum_cost_page_miss), pokud neexistují žádné mrtvé řazené kolekce členů. Operace vakua se zastaví, když proces překročí autovacuum_vacuum_cost_limit.

Po dosažení limitu proces přejde do režimu spánku po dobu trvání určenou parametrem autovacuum_vacuum_cost_delay, než se znovu spustí. Pokud limit není dosažen, autovacuum se spustí po hodnotě zadané parametrem autovacuum_naptime.

Obecně platí, že parametry autovacuum_vacuum_cost_delay a autovacuum_vacuum_cost_limit řídí, kolik čištění dat je povoleno za jednotku času. Všimněte si, že výchozí hodnoty jsou pro většinu cenových úrovní příliš nízké. Optimální hodnoty pro tyto parametry jsou závislé na cenových úrovních a měly by se odpovídajícím způsobem nakonfigurovat.

Parametr autovacuum_max_workers určuje maximální počet procesů automatického úklidu, které lze spustit současně.

Pomocí PostgreSQL můžete tyto parametry nastavit na úrovni tabulky nebo na úrovni instance. V současné době můžete tyto parametry nastavit na úrovni tabulky pouze ve službě Azure Database for PostgreSQL.

Optimalizace automatického úklidu na tabulku

Pro každou tabulku můžete nakonfigurovat všechny předchozí parametry konfigurace. Tady je příklad:

ALTER TABLE t SET (autovacuum_vacuum_threshold = 1000);
​ALTER TABLE t SET (autovacuum_vacuum_scale_factor = 0.1);
ALTER TABLE t SET (autovacuum_vacuum_cost_limit = 1000);
ALTER TABLE t SET (autovacuum_vacuum_cost_delay = 10);

Autovacuum je synchronní proces pro jednotlivé tabulky. Větší procento mrtvých řazených kolekcí členů, které tabulka obsahuje, tím vyšší jsou náklady na automatické úklidy. Tabulky, které mají vysokou míru aktualizací, můžete rozdělit do několika tabulek. Rozdělení tabulek pomáhá paralelizovat automatické úklidy a snížit náklady na dokončení automatického úklidu v jedné tabulce. Můžete také zvýšit počet paralelních pracovních procesů automatického úklidu, aby se zajistilo, že jsou pracovníci naplánovali svobodně.

Další kroky

Další informace o používání a ladění automatického úklidu najdete v následující dokumentaci k PostgreSQL: