PostgreSQL na VPS: jak dimenzovat paměť a disk

Rychlá databáze PostgreSQL je databáze, jejíž často čtená data se vejdou do paměti. Z toho vychází celé dimenzování: objem databáze, část, se kterou se skutečně pracuje, počet připojení a pak disk a jeho rezerva. Tento průvodce uvádí postup, výchozí nastavení pro 4, 8 a 16 GB paměti a dotazy, které změří stávající databázi.

Publikováno 29. října 2026 Autor: Doba čtení: 10 minut

Všichni průvodci

To nejdůležitější

  1. Změřte objem databáze a jejích indexů a pak část, která se čte často: právě ta se musí vejít do paměti.
  2. Výchozí bod: shared_buffers na 25 % paměti, effective_cache_size na 75 %, random_page_cost = 1.1 na SSD NVMe.
  3. Každé připojení je proces: od několika desítek aktivních připojení výš zařaďte před databázi PgBouncer.
  4. Disk: data a indexy za rok plus nejméně 30 % rezervy. Plný disk PostgreSQL zastaví.
  5. Podíl čtení z cache musí zůstat nad 99 %: pod touto hranicí databázi chybí paměť.
  6. Zálohujte každý den pomocí pg_dump, mimo server, a zálohu pravidelně obnovte, abyste ji ověřili.

Vycházet z objemu, se kterým se pracuje

Paměť databázového serveru slouží především jako cache: stránka přečtená z paměti se obslouží mnohem rychleji než stránka přečtená z disku, i z NVMe. Otázka tedy nezní jen „kolik databáze váží?“, ale „jaká její část se čte často?“. Databáze o 50 GB, ve které se používá jen posledních dvanáct měsíců, možná pracuje s 8 GB.

Na stávající databázi ukážou dva dotazy celkový objem a největší tabulky, včetně indexů:

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

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

U budoucí databáze odhadněte objem tabulku po tabulce: očekávaný počet řádků za rok × průměrná velikost řádku, a pak přidejte indexy, které běžně váží 30 až 100 % dat. Příklad: 2 miliony řádků měsíčně po 500 bajtech dávají za rok 12 GB dat a s indexy 18 až 24 GB.

Paměť: výchozí nastavení

PostgreSQL uchovává přečtené stránky na dvou úrovních: ve vlastní cache (shared_buffers) a v souborové cache systému. Jeho dokumentace doporučuje na vyhrazeném serveru začít s 25 % paměti pro shared_buffers a uvádí, že nad 40 % bývá přínos vzácný: zbytek prospívá cache systému a řazení.

Parametr4 GB8 GB16 GBRole
shared_buffers1 GB2 GB4 GBVlastní cache PostgreSQL
effective_cache_size3 GB6 GB12 GBOdhad celkové cache, který ovlivňuje volbu plánů dotazů
work_mem8 MB16 MB32 MBPaměť pro každé řazení nebo hashování v rámci připojení: násobí se počtem souběžných dotazů
maintenance_work_mem256 MB512 MB1 GBVytváření indexů a VACUUM
random_page_cost1.11.11.1Odhadovaná náročnost náhodného čtení: výchozí hodnota 4, vysoko nad skutečností na SSD NVMe

Tyto hodnoty předpokládají databázi, která na serveru běží sama. Pokud vedle ní běží aplikace, nejdřív odečtěte její paměť (procesy, cache, sestavení) a procenta použijte na zbytek: server s 8 GB, na kterém běží aplikace o 3 GB, se nastavuje jako databáze s 5 GB.

postgresql.conf pro server s 8 GB vyhrazený databázi
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers se projeví až po restartu PostgreSQL; ostatní parametry se načtou bez přerušení pomocí SELECT pg_reload_conf();.

Zda paměť stačí, zjistíte z podílu čtení z cache. U firemní aplikace nebo webu přesahuje 99 %:

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

Připojení: každé je proces

PostgreSQL otevírá jeden proces na každé připojení a ve výchozím nastavení jich přijímá 100 (max_connections). Každý proces zabírá v klidu několik megabajtů, více, když řadí nebo hashuje data (work_mem, někdy i několikrát v jediném dotazu). Zvýšit max_connections na 500 kvůli upovídané aplikaci znamená vystavit server riziku, že mu při první špičce dojde paměť.

Správnou odpovědí je pooler připojení: PgBouncer v režimu transaction nechá stovky připojení aplikace sdílet několik desítek skutečných připojení. Frameworky mají i vlastní pool (SQLAlchemy, Prisma, HikariCP): jeho velikost nastavte podle počtu vCPU databázového serveru, ne podle počtu uživatelů.

Disk: objem, rezerva a transakční log

Disk serveru PostgreSQL nese víc než jen tabulky:

Pravidlo: objem za rok plus nejméně 30 % rezervy. Nejde o pohodlí: když se zaplní disk, na kterém leží transakční log, PostgreSQL se zastaví, aby ochránil svá data. Sledujte zaplnění a disk zvětšete dřív, než dosáhne 80 %.

Z hlediska výkonu čeká každé potvrzení transakce na zápis logu na disk: latence úložiště určuje propustnost zápisu. Právě zde SSD NVMe dělá rozdíl, mnohem větší než u čtení, která už obsluhuje paměť.

Procesor: jeden dotaz, jedno jádro

Dotaz PostgreSQL běží na jediném jádře, s výjimkou velkých čtení, která databáze paralelizuje. Počet vCPU proto určuje, kolik náročných dotazů se zpracuje současně: 2 vCPU stačí firemní aplikaci při spuštění, 4 až 8 vyhovují velmi vytíženým databázím a náročným reportům.

Než přidáte vCPU, najděte dotazy, které je spotřebovávají. Rozšíření pg_stat_statements je seřadí podle celkového času:

postgresql.conf, pak restart
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Stejný server jako aplikace, nebo samostatný server?

Při spuštění je databáze na stejném serveru jako aplikace správnou volbou: mezi nimi není žádná síťová latence, připojení vede přes unixový socket a zálohovat a sledovat stačí jediný server. Oddělují se, když si konkurují o prostředky: sestavení nebo špička provozu, která vyprázdní cache databáze, databáze, která potřebuje veškerou paměť pro svá data, nebo odlišné požadavky na zálohování.

Zabezpečení a zálohy

Terminál: komprimovaný export a pak obnova do testovací databáze
pg_dump -Fc -d moje_db -f moje_db-$(date +%F).dump
createdb moje_db_test
pg_restore -d moje_db_test moje_db-2026-10-29.dump

Rychlá databáze PostgreSQL na správném serveru

VPS Pro běží na procesorech Intel Xeon, paměti ECC, která za běhu opravuje chyby, a zrcadlených SSD NVMe, s každým blokem dat ověřeným kontrolním součtem a šifrovanou zálohou každou noc mimo stroj. Komplexní podpora je v ceně: když se vaše databáze zpomalí, rozebereme pomalé dotazy a indexy a doporučíme vám nastavení, která vaší aplikaci vrátí rychlost.

Objevit VPS Pro

Časté otázky

Kolik RAM pro PostgreSQL?

Tolik, aby se často čtená data vešla do paměti. Firemní aplikaci při spuštění stačí 4 GB, včetně databáze i aplikace. Pak měřte podíl čtení z cache: dokud zůstává nad 99 %, paměť stačí.

Jakou hodnotu nastavit pro shared_buffers?

25 % paměti na serveru vyhrazeném databázi, jak doporučuje dokumentace PostgreSQL: 1 GB ze 4 GB, 2 GB z 8 GB, 4 GB z 16 GB. Nad 40 % bývá přínos vzácný, zbytek obstará cache systému.

Kolik připojení PostgreSQL zvládne VPS?

PostgreSQL jich ve výchozím nastavení přijímá 100 a každé připojení je proces, který spotřebovává paměť. Místo zvyšování tohoto stropu zařaďte před databázi pooler, jako je PgBouncer: několik desítek skutečných připojení pak obslouží stovky připojení aplikace.

Je třeba oddělit databázi od aplikace?

Při spuštění ne: na stejném serveru databáze odpovídá bez síťové latence a vše se zálohuje najednou. Oddělují se, když jedna překáží druhé, například když sestavení nebo špička provozu vyprázdní cache databáze.

Kontaktujte nás