PostgreSQL na VPS: ako dimenzovať pamäť a disk

Rýchla databáza PostgreSQL je databáza, ktorej často čítané údaje sa zmestia do pamäte. Z toho vychádza celé dimenzovanie: objem databázy, časť, ktorá naozaj pracuje, počet pripojení a potom disk a jeho rezerva. Tento sprievodca uvádza postup, východiskové nastavenia pre 4, 8 a 16 GB pamäte a dopyty, ktoré zmerajú existujúcu databázu.

Publikované 29. októbra 2026 Autor: Čas čítania: 10 minút

Všetci sprievodcovia

To najdôležitejšie

  1. Zmerajte objem databázy a jej indexov a potom časť, ktorá sa číta často: práve tá sa musí zmestiť do pamäte.
  2. Východiskový bod: shared_buffers na 25 % pamäte, effective_cache_size na 75 %, random_page_cost = 1.1 na SSD NVMe.
  3. Každé pripojenie je proces: nad niekoľko desiatok aktívnych pripojení predraďte databáze PgBouncer.
  4. Disk: údaje a indexy o rok, plus aspoň 30 % rezerva. Plný disk PostgreSQL zastaví.
  5. Podiel čítaní z cache musí zostať nad 99 %: pod touto hranicou databáze chýba pamäť.
  6. Zálohujte každý deň pomocou pg_dump, mimo servera, a pravidelne zálohu obnovte, aby ste ju overili.

Vychádzať z užitočného objemu

Pamäť databázového servera slúži predovšetkým ako cache: stránka prečítaná z pamäte sa obslúži oveľa rýchlejšie než stránka prečítaná z disku, aj z NVMe. Otázka teda neznie len „koľko váži databáza?“, ale aj „aká jej časť sa číta často?“. Databáza s veľkosťou 50 GB, v ktorej sa čítajú len údaje za posledných dvanásť mesiacov, môže pracovať s 8 GB.

Na existujúcej databáze dajú dva dopyty celkový objem a najväčšie tabuľky vrátane indexov:

SQL (psql)
SELECT pg_size_pretty(pg_database_size(current_database()));

SELECT relname AS nazov,
       pg_size_pretty(pg_total_relation_size(relid)) AS velkost_s_indexmi
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;

Pri budúcej databáze odhadujte tabuľku po tabuľke: počet riadkov očakávaný o rok × priemerná veľkosť riadku, a potom pridajte indexy, ktoré bežne vážia 30 až 100 % údajov. Príklad: 2 milióny riadkov mesačne, každý s veľkosťou 500 bajtov, dajú o rok 12 GB údajov a s indexmi 18 až 24 GB.

Pamäť: východiskové nastavenia

PostgreSQL drží prečítané stránky na dvoch úrovniach: vo vlastnej cache (shared_buffers) a v cache súborov systému. Jeho dokumentácia odporúča začať s 25 % pamäte pre shared_buffers na vyhradenom serveri a konštatuje, že nad 40 % je prínos zriedkavý: zvyšok prospieva cache systému a triedeniu.

Parameter4 GB8 GB16 GBÚloha
shared_buffers1 GB2 GB4 GBVlastná cache PostgreSQL
effective_cache_size3 GB6 GB12 GBOdhadovaná celková cache, ktorá usmerňuje výber plánov dopytov
work_mem8 MB16 MB32 MBPamäť pre každé triedenie alebo hašovanie, na pripojenie: vynásobte počtom súbežných dopytov
maintenance_work_mem256 MB512 MB1 GBVytváranie indexov a VACUUM
random_page_cost1.11.11.1Odhadované náklady na náhodné čítanie: predvolene 4, ďaleko nad skutočnými nákladmi na SSD NVMe

Tieto hodnoty predpokladajú, že databáza je na serveri sama. Ak vedľa nej beží aplikácia, najprv odpočítajte jej pamäť (procesy, cache, kompilácia) a percentá použite na zvyšok: server s 8 GB, na ktorom beží aplikácia s 3 GB, sa nastavuje ako databáza s 5 GB.

postgresql.conf pre server s 8 GB vyhradený pre databázu
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers sa prejaví až po reštarte PostgreSQL; ostatné parametre sa načítajú bez prerušenia, príkazom SELECT pg_reload_conf();.

Či pamäť stačí, zistíte z podielu čítaní z cache. Pri podnikovej aplikácii alebo webe presahuje 99 %:

SQL (psql)
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS podiel_cache
FROM pg_stat_database
WHERE datname = current_database();

Pripojenia: každé je proces

PostgreSQL otvára jeden proces na pripojenie a predvolene ich prijme 100 (max_connections). Každý proces zaberá v nečinnosti niekoľko megabajtov, viac, keď triedi alebo hašuje údaje (work_mem, niekedy viackrát v jednom dopyte). Zvýšiť max_connections na 500, aby ste stačili aplikácii, ktorá otvára veľa pripojení, znamená vystaviť server riziku, že mu pri prvej špičke dôjde pamäť.

Správnou odpoveďou je pooler pripojení: PgBouncer v režime transaction nechá stovky pripojení aplikácie zdieľať niekoľko desiatok skutočných pripojení. Frameworky majú aj vlastný pool (SQLAlchemy, Prisma, HikariCP): jeho veľkosť nastavte podľa počtu vCPU databázového servera, nie podľa počtu používateľov.

Disk: objem, rezerva a transakčný log

Disk servera PostgreSQL nesie viac než len tabuľky:

Pravidlo: objem o rok, plus aspoň 30 % rezerva. Nejde o pohodlie: keď sa disk s transakčným logom zaplní, PostgreSQL sa zastaví, aby ochránil svoje údaje. Sledujte obsadenosť a disk zväčšite skôr, než dosiahne 80 %.

Z hľadiska výkonu čaká každé potvrdenie transakcie na zápis logu na disk: latencia úložiska určuje priepustnosť zápisu. Práve tu robí SSD NVMe rozdiel, oveľa viac než pri čítaní, ktoré už obsluhuje pamäť.

Procesor: jeden dopyt, jedno jadro

Dopyt v PostgreSQL beží na jedinom jadre, okrem veľkých čítaní, ktoré databázový stroj paralelizuje. Počet vCPU preto určuje, koľko náročných dopytov sa spracúva súčasne: pri spustení podnikovej aplikácie stačia 2 vCPU, 4 až 8 vyhovuje veľmi vyťaženým databázam a náročným reportom.

Skôr než pridáte vCPU, nájdite dopyty, ktoré ich spotrebúvajú. Rozšírenie pg_stat_statements ich zoradí podľa celkového času:

postgresql.conf, potom reštart
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

SELECT calls, round(total_exec_time) AS ms_spolu,
       round(mean_exec_time::numeric, 1) AS ms_priemer, query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Na rovnakom serveri ako aplikácia, alebo na samostatnom?

Pri spustení je databáza na tom istom serveri ako aplikácia správnou voľbou: žiadna sieťová latencia medzi nimi, pripojenie cez unixový socket, jediný server na zálohovanie a sledovanie. Oddeľujú sa, keď si konkurujú o prostriedky: kompilácia alebo návštevnostná špička, ktorá vyprázdni cache databázy, databáza, ktorá potrebuje celú pamäť pre svoje údaje, alebo rozdielne požiadavky na zálohovanie.

Bezpečnosť a zálohy

Terminál: komprimovaný export a potom obnova do testovacej databázy
pg_dump -Fc -d moja_db -f moja_db-$(date +%F).dump
createdb moja_db_test
pg_restore -d moja_db_test moja_db-2026-10-29.dump

Rýchla databáza PostgreSQL na správnom serveri

VPS Pro beží na procesoroch Intel Xeon, pamäti ECC, ktorá za behu opravuje chyby, a zrkadlených SSD NVMe, s každým blokom údajov overeným kontrolným súčtom a so šifrovanou zálohou každú noc, mimo stroja. Komplexná podpora je v cene: keď sa vaša databáza spomalí, rozoberieme pomalé dopyty a indexy a odporučíme vám nastavenia, ktoré vašej aplikácii vrátia rýchlosť.

Objaviť VPS Pro

Časté otázky

Koľko RAM potrebuje PostgreSQL?

Toľko, aby sa často čítané údaje zmestili do pamäte. Pri spustení podnikovej aplikácie stačia 4 GB, vrátane databázy aj aplikácie. Potom sledujte podiel čítaní z cache: kým zostáva nad 99 %, pamäť stačí.

Akú hodnotu nastaviť pre shared_buffers?

25 % pamäte na serveri vyhradenom pre databázu, ako odporúča dokumentácia PostgreSQL: 1 GB pri 4 GB, 2 GB pri 8 GB, 4 GB pri 16 GB. Nad 40 % je prínos zriedkavý, pretože zvyšok zvládne cache systému.

Koľko pripojení PostgreSQL zvládne VPS?

PostgreSQL ich predvolene prijme 100 a každé pripojenie je proces, ktorý spotrebúva pamäť. Namiesto zvyšovania tohto stropu predraďte databáze pooler, napríklad PgBouncer: niekoľko desiatok skutočných pripojení potom obslúži stovky pripojení aplikácie.

Treba databázu a aplikáciu oddeliť?

Pri spustení nie: na tom istom serveri databáza odpovedá bez sieťovej latencie a celok sa zálohuje naraz. Oddeľujú sa, keď jedna prekáža druhej, napríklad keď kompilácia alebo návštevnostná špička vyprázdni cache databázy.

Kontaktujte nás