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.
shared_buffers na 25 % pamäte, effective_cache_size na 75 %, random_page_cost = 1.1 na SSD NVMe.pg_dump, mimo servera, a pravidelne zálohu obnovte, aby ste ju overili.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:
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.
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.
| Parameter | 4 GB | 8 GB | 16 GB | Úloha |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | Vlastná cache PostgreSQL |
effective_cache_size | 3 GB | 6 GB | 12 GB | Odhadovaná celková cache, ktorá usmerňuje výber plánov dopytov |
work_mem | 8 MB | 16 MB | 32 MB | Pamäť pre každé triedenie alebo hašovanie, na pripojenie: vynásobte počtom súbežných dopytov |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Vytváranie indexov a VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Odhadované 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.
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 %:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS podiel_cache
FROM pg_stat_database
WHERE datname = current_database();
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 servera PostgreSQL nesie viac než len tabuľky:
max_wal_size), viac počas hromadného importu a ešte viac, ak archivácia logu mešká.work_mem.VACUUM FULL a prestavba indexu zapíšu úplnú kópiu skôr, než uvoľnia pôvodnú.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äť.
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:
shared_preload_libraries = 'pg_stat_statements'
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;
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.
listen_addresses = 'localhost', kým sa pripája len aplikácia na tom istom serveri. Ak k databáze musí pristupovať iný server, otvorte port 5432 len pre jeho adresu, vo firewalle aj v pg_hba.conf.scram-sha-256 v pg_hba.conf, jedna rola na aplikáciu, bez práv superpoužívateľa.pg_dump, skopírovaná mimo servera.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
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ť.
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čí.
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.
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.
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.
Simafri
Porozprávajme sa o vašom zámere
Povedzte nám v pár slovách, čo potrebujete: rýchlo sa vám ozveme.
Ďakujeme! Vaša žiadosť bola odoslaná. Čoskoro sa vám ozveme.
Máte radšej e-mail? Napíšte nám na support@simafri.com.