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ő.
shared_buffers a memória 25%-a, effective_cache_size a 75%-a, random_page_cost = 1.1 NVMe SSD-n.pg_dump segítségével, a szerveren kívülre, és rendszeresen állítsa vissza, hogy ellenőrizze.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:
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 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éter | 4 GB | 8 GB | 16 GB | Szerepe |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | A PostgreSQL saját gyorsítótára |
effective_cache_size | 3 GB | 6 GB | 12 GB | A becsült teljes gyorsítótár, amely a lekérdezési tervek kiválasztását irányítja |
work_mem | 8 MB | 16 MB | 32 MB | Minden rendezés vagy hash-művelet memóriája, kapcsolatonként: szorozza meg az egyidejű lekérdezések számával |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Az indexek létrehozása és a VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Egy 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.
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:
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 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.
Egy PostgreSQL-szerver lemeze többet tárol a tábláknál:
max_wal_size), több egy tömeges importálás alatt, és még több, ha a napló archiválása lemarad.work_mem értékét.VACUUM FULL és egy index újraépítése teljes másolatot ír, mielőtt felszabadítaná a régit.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.
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:
shared_preload_libraries = 'pg_stat_statements'
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;
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.
listen_addresses = 'localhost', amíg csak a szerveren futó alkalmazás kapcsolódik. Ha egy másik szervernek is hozzá kell férnie, az 5432-es portot csak annak címe számára nyissa meg, a tűzfalban és a pg_hba.conf fájlban.scram-sha-256 módszer a pg_hba.conf fájlban, alkalmazásonként egy szerepkör, szuperfelhasználói jogok nélkül.pg_dump segítségével, a szerveren kívülre másolva.pg_dump -Fc -d adatbazis -f adatbazis-$(date +%F).dump
createdb adatbazis_teszt
pg_restore -d adatbazis_teszt adatbazis-2026-10-29.dump
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.
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ő.
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.
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.
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.
Simafri
Beszéljünk a weboldaláról
Meséljen néhány szóban a projektjéről: hamarosan jelentkezünk.
Köszönjük! Kérését elküldtük. Hamarosan válaszolunk.
Inkább e-mailben? Írjon nekünk ide: support@simafri.com.