PostgreSQL VPS-en: a memória és a lemez méretezése

Gyors az a PostgreSQL-adatbázis, amelynek gyakran lekérdezett adatai elférnek a memóriában. Az egész méretezés innen indul: az adatbázis mérete, a ténylegesen használt része, a kapcsolatok száma, majd a lemez és a tartaléka. Ez az útmutató megadja a módszert, a kiinduló beállításokat 4, 8 és 16 GB memóriához, valamint azokat a lekérdezéseket, amelyekkel egy meglévő adatbázis mérhető.

Közzétéve 2026. október 29-én Szerző: Olvasási idő: 10 perc

Minden útmutató

A lényeg röviden

  1. Mérje meg az adatbázis és indexei méretét, majd a gyakran lekérdezett részt: ennek kell elférnie a memóriában.
  2. Kiindulópont: shared_buffers a memória 25%-a, effective_cache_size a 75%-a, random_page_cost = 1.1 NVMe SSD-n.
  3. Minden kapcsolat egy folyamat: néhány tucat aktív kapcsolat felett tegyen PgBouncert az adatbázis elé.
  4. Lemez: az adatok és az indexek egy év múlva várható mérete, plusz legalább 30% tartalék. A megtelt lemez leállítja a PostgreSQL-t.
  5. A gyorsítótár-találati aránynak 99% felett kell maradnia: ha alá esik, az adatbázisnak kevés a memóriája.
  6. Mentsen naponta pg_dump segítségével, a szerveren kívülre, és rendszeresen állítsa vissza, hogy ellenőrizze.

Kiindulás a hasznos adatmennyiségből

Egy adatbázis-szerver memóriája elsősorban gyorsítótárként szolgál: a memóriából olvasott lap sokkal gyorsabban kiszolgálható, mint a lemezről olvasott, még NVMe esetén is. A kérdés tehát nem csak az, hogy „mekkora az adatbázis?”, hanem az, hogy „mekkora részét olvassák gyakran?”. Egy 50 GB-os adatbázis, amelynek csak az utolsó tizenkét hónapját kérdezik le, talán 8 GB-on dolgozik.

Egy meglévő adatbázison két lekérdezés adja meg a teljes méretet és a legnagyobb táblákat, indexekkel együtt:

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

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

Egy még elkészítendő adatbázisnál becsüljön táblánként: az egy év múlva várható sorok száma × egy sor átlagos mérete, majd adja hozzá az indexeket, amelyek gyakran az adatok 30 és 100%-a közötti helyet foglalnak. Példa: havi 2 millió, egyenként 500 bájtos sor egy év alatt 12 GB adatot jelent, az indexekkel pedig 18 és 24 GB között.

A memória: a kiinduló beállítások

A PostgreSQL két szinten tartja a beolvasott lapokat: a saját gyorsítótárában (shared_buffers) és a rendszer fájlgyorsítótárában. A dokumentációja azt javasolja, hogy egy dedikált szerveren a shared_buffers a memória 25%-áról induljon, és megjegyzi, hogy 40% felett ritkán van nyereség: a maradék a rendszer gyorsítótárának és a rendezéseknek jut.

Paraméter4 GB8 GB16 GBSzerepe
shared_buffers1 GB2 GB4 GBA PostgreSQL saját gyorsítótára
effective_cache_size3 GB6 GB12 GBA becsült teljes gyorsítótár, amely a lekérdezési tervek kiválasztását irányítja
work_mem8 MB16 MB32 MBMinden rendezés vagy hash-művelet memóriája, kapcsolatonként: szorozza meg az egyidejű lekérdezések számával
maintenance_work_mem256 MB512 MB1 GBAz indexek létrehozása és a VACUUM
random_page_cost1.11.11.1Egy véletlenszerű olvasás becsült költsége: alapértelmezés szerint 4, ami jóval a valós költség felett van NVMe SSD-n

Ezek az értékek azt feltételezik, hogy az adatbázis egyedül fut a szerveren. Ha mellette az alkalmazás is fut, először vonja le annak memóriáját (folyamatok, gyorsítótár, fordítás), és a százalékokat a maradékra alkalmazza: egy 8 GB-os szerver, amely egy 3 GB-os alkalmazást futtat, úgy hangolandó, mint egy 5 GB-os adatbázis-szerver.

postgresql.conf, egy csak az adatbázisnak szentelt 8 GB-os szerverhez
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

A shared_buffers csak a PostgreSQL újraindításakor lép életbe; a többi paraméter megszakítás nélkül újratölthető a SELECT pg_reload_conf(); paranccsal.

Ahhoz, hogy megtudja, elég-e a memória, olvassa le a gyorsítótár-találati arányt. Egy ügyviteli alkalmazásnál vagy egy weboldalnál ez 99% felett van:

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

A kapcsolatok: mindegyik egy folyamat

A PostgreSQL kapcsolatonként egy folyamatot nyit, és alapértelmezés szerint 100 kapcsolatot fogad (max_connections). Minden folyamat nyugalmi állapotban néhány megabájtot foglal, többet, amikor adatokat rendez vagy hashel (work_mem, egyetlen lekérdezésen belül akár többször is). Ha egy bőbeszédű alkalmazás kedvéért 500-ra emeli a max_connections értékét, azzal kiteszi a szervert annak, hogy az első csúcsnál elfogyjon a memóriája.

A jó válasz egy kapcsolatkészlet-kezelő (connection pooler): a PgBouncer transaction módban néhány tucat valós kapcsolaton osztoztatja meg az alkalmazás több száz kapcsolatát. A keretrendszereknek is van saját kapcsolatkészletük (SQLAlchemy, Prisma, HikariCP): a méretét az adatbázis-szerver vCPU-inak számához igazítsa, ne a felhasználók számához.

A lemez: méret, tartalék és napló

Egy PostgreSQL-szerver lemeze többet tárol a tábláknál:

A szabály: az egy év múlva várható méret, plusz legalább 30% tartalék. Ez nem kényelmi kérdés: amikor a tranzakciós naplót tároló lemez megtelik, a PostgreSQL leáll, hogy megvédje az adatait. Figyelje a foglaltságot, és bővítsen, mielőtt eléri a 80%-ot.

Teljesítmény szempontjából minden tranzakció véglegesítése megvárja, hogy a napló kiíródjon a lemezre: a tároló késleltetése határozza meg az írási teljesítményt. Itt jelent igazi különbséget az NVMe SSD, sokkal inkább, mint az olvasásoknál, amelyeket már a memória kiszolgál.

A processzor: egy lekérdezés, egy mag

Egy PostgreSQL-lekérdezés egyetlen magon fut, kivéve a nagy olvasásokat, amelyeket a motor párhuzamosít. A vCPU-k száma tehát meghatározza, hány nehéz lekérdezés fut egyszerre: induláskor 2 vCPU elég egy ügyviteli alkalmazásnak, a nagyon terhelt adatbázisokhoz és a nehéz jelentésekhez 4 és 8 közötti vCPU illik.

Mielőtt vCPU-t adna hozzá, keresse meg azokat a lekérdezéseket, amelyek fogyasztják őket. A pg_stat_statements bővítmény összesített idő szerint rangsorolja őket:

postgresql.conf, majd újraindítás
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Ugyanaz a szerver, mint az alkalmazásé, vagy külön szerver?

Induláskor az a jó választás, ha az adatbázis az alkalmazással azonos szerveren fut: nincs hálózati késleltetés a kettő között, a kapcsolat Unix-socketen megy, és egyetlen szervert kell menteni és felügyelni. Akkor érdemes szétválasztani őket, amikor versengenek az erőforrásokért: egy fordítás vagy egy forgalmi csúcs kiüríti az adatbázis gyorsítótárát, az adatbázisnak az összes memóriára szüksége van az adataihoz, vagy eltérőek a mentési követelmények.

Biztonság és mentések

Terminál: tömörített export, majd visszaállítás egy tesztadatbázisba
pg_dump -Fc -d adatbazis -f adatbazis-$(date +%F).dump
createdb adatbazis_teszt
pg_restore -d adatbazis_teszt adatbazis-2026-10-29.dump

Gyors PostgreSQL-adatbázis, a megfelelő szerveren

A VPS Pro Intel Xeon processzorokon, menet közben hibát javító ECC memórián és tükrözött NVMe SSD-ken fut; minden adatblokkot ellenőrzőösszeggel ellenőrzünk, és minden éjjel titkosított mentés készül, a gépen kívül tárolva. A Teljes körű támogatás a csomag része: amikor az adatbázisa lelassul, elemezzük a lassú lekérdezéseket és az indexeket, majd megmutatjuk azokat a beállításokat, amelyekkel alkalmazása visszanyeri a sebességét.

Tovább a VPS Pro oldalára

Gyakori kérdések

Mennyi RAM kell a PostgreSQL-hez?

Annyi, hogy a gyakran lekérdezett adatok elférjenek a memóriában. Egy induló ügyviteli alkalmazáshoz 4 GB elég, az adatbázissal és az alkalmazással együtt. Ezután mérje a gyorsítótár-találati arányt: amíg 99% felett marad, a memória elegendő.

Milyen értéket adjak a shared_buffers paraméternek?

A memória 25%-át egy csak az adatbázisnak szentelt szerveren, ahogy a PostgreSQL dokumentációja javasolja: 1 GB-ot 4 GB-on, 2 GB-ot 8 GB-on, 4 GB-ot 16 GB-on. 40% felett ritkán van nyereség, a többit a rendszer gyorsítótára végzi.

Hány PostgreSQL-kapcsolatot bír el egy VPS?

A PostgreSQL alapértelmezés szerint 100 kapcsolatot fogad, és minden kapcsolat egy memóriát fogyasztó folyamat. A plafon emelése helyett tegyen egy kapcsolatkészlet-kezelőt, például a PgBouncert az adatbázis elé: így néhány tucat valós kapcsolat szolgálja ki az alkalmazás több száz kapcsolatát.

Szét kell választani az adatbázist és az alkalmazást?

Induláskor nem: ugyanazon a szerveren az adatbázis hálózati késleltetés nélkül válaszol, és az egész egyben menthető. Akkor érdemes szétválasztani őket, amikor az egyik zavarja a másikat, például amikor egy fordítás vagy egy forgalmi csúcs kiüríti az adatbázis gyorsítótárát.

Kapcsolatfelvétel