sql >> Databáze >  >> RDS >> PostgreSQL

Co zkontrolovat, zda je využití paměti PostgreSQL vysoké

Čtení z paměti bude vždy výkonnější než přechod na disk, takže pro všechny databázové technologie byste chtěli použít co nejvíce paměti. Pokud si konfigurací nejste jisti nebo máte chybu, může to způsobit vysoké využití paměti nebo dokonce problém s nedostatkem paměti.

V tomto blogu se podíváme na to, jak zkontrolovat využití paměti PostgreSQL a jaký parametr byste měli vzít v úvahu, abyste jej vyladili. Začněme tím, že se podíváme na přehled architektury PostgreSQL.

Architektura PostgreSQL

Architektura PostgreSQL je založena na třech základních částech:Procesy, Paměť a Disk.

Paměť lze rozdělit do dvou kategorií:

  • Místní paměť :Je načten každým procesem backendu pro jeho vlastní použití pro zpracování dotazů. Dělí se na podoblasti:
    • Pracovní paměť:Pracovní paměť se používá k řazení n-tic podle operací ORDER BY a DISTINCT a ke spojování tabulek.
    • Údržbářské práce:Tuto oblast využívají některé druhy operací údržby. Například VACUUM, pokud nezadáte autovacuum_work_mem.
    • Dočasné vyrovnávací paměti:Používá se pro ukládání dočasných tabulek.
  • Sdílená paměť :Přiděluje ho server PostgreSQL při jeho spuštění a používají ho všechny procesy. Dělí se na podoblasti:
    • Sdílený fond vyrovnávacích pamětí:Místo, kde PostgreSQL načítá stránky s tabulkami a indexy z disku, aby pracovaly přímo z paměti, což snižuje přístup k disku.
    • Vyrovnávací paměť WAL:Data WAL jsou protokolem transakcí v PostgreSQL a obsahují změny v databázi. Vyrovnávací paměť WAL je oblast, kde jsou dočasně uložena data WAL před jejich zapsáním na disk do souborů WAL. To se provádí každý předem definovaný čas nazývaný kontrolní bod. To je velmi důležité, aby nedošlo ke ztrátě informací v případě selhání serveru.
    • Protokol potvrzení:Ukládá stav všech transakcí pro kontrolu souběžnosti.

Jak zjistit, co se děje

Pokud máte vysoké využití paměti, měli byste nejprve potvrdit, který proces generuje spotřebu.

Použití „Top“ Linux Command

Tady je pravděpodobně nejlepší volbou horní linuxový příkaz (nebo dokonce podobný jeden jako htop). Pomocí tohoto příkazu můžete vidět proces/procesy, které spotřebovávají příliš mnoho paměti.

Když potvrdíte, že za tento problém může PostgreSQL, dalším krokem je zjistit proč.

Použití protokolu PostgreSQL

Kontrola PostgreSQL i systémových protokolů je rozhodně dobrý způsob, jak získat více informací o tom, co se děje ve vaší databázi/systému. Můžete vidět zprávy jako:

Resource temporarily unavailable

Out of memory: Kill process 1161 (postgres) score 366 or sacrifice child

Pokud nemáte dostatek volné paměti.

Nebo dokonce více chyb databázových zpráv jako:

FATAL:  password authentication failed for user "username"

ERROR:  duplicate key value violates unique constraint "sbtest21_pkey"

ERROR:  deadlock detected

Když zaznamenáte nějaké neočekávané chování na straně databáze. Protokoly jsou užitečné pro detekci těchto druhů problémů a ještě více. Toto sledování můžete zautomatizovat analýzou souborů protokolů a hledáním prací jako „FATAL“, „ERROR“ nebo „Kill“, takže když k tomu dojde, obdržíte upozornění.

Použití Pg_top

Pokud víte, že proces PostgreSQL má vysoké využití paměti, ale logy nepomohly, máte jiný nástroj, který zde může být užitečný, pg_top.

Tento nástroj je podobný špičkovému linuxovému nástroji, ale je speciálně pro PostgreSQL. Díky tomu budete mít podrobnější informace o tom, co spouští vaši databázi, a můžete dokonce zabíjet dotazy nebo spustit úlohu vysvětlení, pokud zjistíte něco špatného. Více informací o tomto nástroji naleznete zde.

Co se ale stane, když nezjistíte žádnou chybu a databáze stále využívá hodně paměti RAM. Pravděpodobně tedy budete muset zkontrolovat konfiguraci databáze.

Které konfigurační parametry vzít v úvahu

Pokud vše vypadá v pořádku, ale stále máte problém s vysokým využitím, měli byste zkontrolovat konfiguraci a ověřit, zda je správná. Níže jsou uvedeny parametry, které byste v tomto případě měli vzít v úvahu.

shared_buffers

Toto je množství paměti, kterou databázový server používá pro vyrovnávací paměti sdílené paměti. Pokud je tato hodnota příliš nízká, databáze by spotřebovala více disku, což by způsobilo větší zpomalení, ale pokud je příliš vysoká, může generovat vysoké využití paměti. Podle dokumentace, pokud máte dedikovaný databázový server s 1 GB nebo více paměti RAM, rozumná počáteční hodnota pro shared_buffers je 25 % paměti ve vašem systému.

work_mem

Udává množství paměti, které bude využito příkazy ORDER BY, DISTINCT a JOIN před zápisem do dočasných souborů na disk. Stejně jako u shared_buffers, pokud nastavíme tento parametr příliš nízko, můžeme mít na disku více operací, ale příliš vysoký je nebezpečný pro využití paměti. Výchozí hodnota je 4 MB.

max_connections

Work_mem jde také ruku v ruce s hodnotou max_connections, protože každé připojení bude provádět tyto operace ve stejnou dobu a každá operace bude mít povoleno využívat tolik paměti, kolik určuje tato hodnota před ní začne zapisovat data do dočasných souborů. Tento parametr určuje maximální počet současných připojení k naší databázi, pokud nakonfigurujeme vysoký počet připojení a nebereme to v úvahu, můžete začít mít problémy se zdroji. Výchozí hodnota je 100.

temp_buffers

Dočasné vyrovnávací paměti se používají k ukládání dočasných tabulek používaných v každé relaci. Tento parametr nastavuje maximální množství paměti pro tuto úlohu. Výchozí hodnota je 8 MB.

maintenance_work_mem

Toto je maximální paměť, kterou může zabrat operace jako vysávání, přidávání indexů nebo cizích klíčů. Dobrá věc je, že v relaci lze spustit pouze jednu operaci tohoto typu a není nejběžnější spouštět v systému několik těchto operací současně. Výchozí hodnota je 64 MB.

autovacuum_work_mem

Vakuum používá standardně maintenance_work_mem, ale můžeme jej oddělit pomocí tohoto parametru. Zde můžeme specifikovat maximální množství paměti, které může použít každý pracovník automatického vysávání.

wal_buffers

Množství sdílené paměti použité pro data WAL, která ještě nebyla zapsána na disk. Výchozí nastavení je 3 % sdílených_bufferů, ale ne méně než 64 kB a více než velikost jednoho segmentu WAL, obvykle 16 MB.

Závěr

Existují různé důvody pro vysoké využití paměti a zjišťování problému s kořenem může být časově náročný úkol. V tomto blogu jsme zmínili různé způsoby, jak zkontrolovat využití paměti PostgreSQL a který parametr byste měli vzít v úvahu při jeho vyladění, abyste se vyhnuli nadměrnému využití paměti.


  1. Zkontrolujte, zda je aktuální datum mezi dvěma daty Oracle SQL

  2. Zobrazení dat v RecyclerView

  3. MariaDB LOCALTIME() Vysvětleno

  4. Jak mohu inicializovat databázi MySQL se schématem v kontejneru Docker?