PostgreSQL VPS-is: kui palju mälu ja kettaruumi on vaja

Kiire PostgreSQL-i andmebaas on andmebaas, mille sageli loetavad andmed mahuvad mällu. Kogu mõõtmine lähtub sellest: andmebaasi maht, osa, mis tegelikult töös on, ühenduste arv, seejärel ketas ja selle varu. See juhend annab meetodi, lähteseadistused 4, 8 ja 16 GB mälu jaoks ning päringud, mis mõõdavad olemasolevat andmebaasi.

Avaldatud 29. oktoobril 2026 Autor: Lugemisaeg: 10 minutit

Kõik juhendid

Lühidalt

  1. Mõõtke andmebaasi ja selle indeksite maht, seejärel sageli loetav osa: just see peab mahtuma mällu.
  2. Lähtepunkt: shared_buffers 25 % mälust, effective_cache_size 75 %, NVMe SSD-l random_page_cost = 1.1.
  3. Iga ühendus on protsess: kui aktiivseid ühendusi on üle mõnekümne, paigutage andmebaasi ette PgBouncer.
  4. Ketas: andmed ja indeksid aasta pärast, pluss vähemalt 30 % varu. Täis ketas peatab PostgreSQL-i.
  5. Vahemälust lugemise määr peab püsima üle 99 %: sellest allpool napib andmebaasil mälu.
  6. Varundage iga päev pg_dump-iga, väljaspool serverit, ja taastage regulaarselt, et seda kontrollida.

Lähtuge kasulikust mahust

Andmebaasiserveri mälu toimib eelkõige vahemäluna: mälust loetud leht serveeritakse palju kiiremini kui kettalt loetud leht, isegi NVMe puhul. Küsimus ei ole seega ainult «kui palju andmebaas kaalub?», vaid «milline osa sellest loetakse sageli?». 50 GB andmebaas, millest päritakse ainult viimast kaheteistkümmet kuud, töötab võib-olla 8 GB peal.

Olemasolevas andmebaasis annavad kaks päringut kogumahu ja suurimad tabelid koos indeksitega:

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

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

Tulevase andmebaasi puhul hinnake tabelite kaupa: aasta pärast oodatav ridade arv × rea keskmine suurus, seejärel lisage indeksid, mis kaaluvad tavaliselt 30 kuni 100 % andmetest. Näide: 2 miljonit rida kuus, igaüks 500 baiti, teeb aasta pärast 12 GB andmeid ja koos indeksitega 18 kuni 24 GB.

Mälu: lähteseadistused

PostgreSQL hoiab loetud lehti kahel tasandil: oma vahemälus (shared_buffers) ja süsteemi failivahemälus. Selle dokumentatsioon soovitab andmebaasile pühendatud serveris alustada shared_buffers väärtusest 25 % mälust ja märgib, et üle 40 % muutub kasu haruldaseks: ülejäänu tuleb kasuks süsteemi vahemälule ja sortimistele.

Parameeter4 GB8 GB16 GBRoll
shared_buffers1 GB2 GB4 GBPostgreSQL-i enda vahemälu
effective_cache_size3 GB6 GB12 GBHinnanguline kogu vahemälu, mis suunab päringuplaanide valikut
work_mem8 MB16 MB32 MBIga sortimise või räsimise mälu ühenduse kohta: korrutage samaaegsete päringute arvuga
maintenance_work_mem256 MB512 MB1 GBIndeksite loomine ja VACUUM
random_page_cost1.11.11.1Juhusliku lugemise hinnanguline kulu: vaikimisi 4, tublisti üle tegeliku kulu NVMe SSD-l

Need väärtused eeldavad, et andmebaas on serveris üksi. Kui rakendus töötab samas serveris, lahutage kõigepealt selle mälu (protsessid, vahemälu, kompileerimine) ja rakendage protsente ülejäänule: 8 GB server, mis käitab 3 GB rakendust, seadistatakse nagu 5 GB andmebaas.

postgresql.conf, 8 GB serverile, mis on pühendatud andmebaasile
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers jõustub alles PostgreSQL-i taaskäivitamisel; teised parameetrid laaditakse uuesti ilma katkestuseta käsuga SELECT pg_reload_conf();.

Et teada, kas mälust piisab, lugege vahemälust lugemise määra. Äritarkvara või saidi puhul ületab see 99 %:

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

Ühendused: igaüks eraldi protsess

PostgreSQL avab iga ühenduse jaoks protsessi ja lubab vaikimisi 100 ühendust (max_connections). Iga protsess hõivab jõudeolekus mõne megabaidi, rohkem siis, kui ta sorteerib või räsib andmeid (work_mem, mõnikord mitu korda ühe päringu jooksul). max_connections tõstmine 500-ni, et jutuka rakendusega sammu pidada, seab serveri esimese tipu ajal mälupuuduse ohtu.

Õige vastus on ühenduste koondaja: PgBouncer transaction-režiimis laseb mõnel kümnel tegelikul ühendusel teenindada sadu rakenduse ühendusi. Raamistikel on ka oma ühenduste kogum (SQLAlchemy, Prisma, HikariCP): seadistage selle suurus andmebaasiserveri vCPU-de arvu, mitte kasutajate arvu järgi.

Ketas: maht, varu ja logi

PostgreSQL-i serveri ketas kannab enamat kui tabeleid:

Reegel: maht aasta pärast, pluss vähemalt 30 % varu. See ei ole mugavuse küsimus: kui tehingulogi kandev ketas täitub, peatub PostgreSQL oma andmete kaitseks. Jälgige täituvust ja suurendage ketast enne 80 %.

Jõudluse poolest ootab iga tehingu kinnitamine logi kettale kirjutamist: salvestuse latentsus määrab kirjutamise läbilaskevõime. Just siin teeb NVMe SSD vahet, palju rohkem kui lugemisel, mida teenindab juba mälu.

Protsessor: üks päring, üks tuum

PostgreSQL-i päring täidetakse ühel tuumal, välja arvatud suured lugemised, mida mootor paralleelistab. vCPU-de arv määrab seega samaaegselt töödeldavate raskete päringute arvu: käivitamisel piisab äritarkvarale 2 vCPU-st, 4 kuni 8 sobivad väga koormatud andmebaasidele ja rasketele aruannetele.

Enne vCPU-de lisamist otsige üles päringud, mis neid tarbivad. Laiendus pg_stat_statements järjestab need koguaja järgi:

postgresql.conf, seejärel taaskäivitus
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Rakendusega samas serveris või eraldi serveris?

Käivitamisel on andmebaas rakendusega samas serveris õige valik: nende vahel puudub võrgulatentsus, ühendus käib Unixi sokli kaudu, varundada ja jälgida tuleb ainult ühte serverit. Eraldatakse siis, kui need kaks hakkavad ressursside pärast võistlema: kompileerimine või liiklustipp, mis tühjendab andmebaasi vahemälu, andmebaas, mis vajab kogu mälu oma andmete jaoks, või erinevad varundusnõuded.

Turvalisus ja varukoopiad

Terminal: pakitud eksport, seejärel taastamine testandmebaasi
pg_dump -Fc -d minu_baas -f minu_baas-$(date +%F).dump
createdb minu_baas_test
pg_restore -d minu_baas_test minu_baas-2026-10-29.dump

Kiire PostgreSQL-i andmebaas õigel serveril

VPS Pro töötab Intel Xeon protsessoritel, ECC-mälu, mis parandab vead lennult, ja peegeldatud NVMe SSD-dega, kus iga andmeplokk on kontrollitud kontrollsummaga, ning igal ööl tehakse krüpteeritud varukoopia väljaspool masinat. Terviklik tugi sisaldub: kui teie andmebaas aeglustub, analüüsime aeglasi päringuid ja indekseid ning näitame teile seadistused, mis annavad teie rakendusele kiiruse tagasi.

Vaadake VPS Pro

Korduma kippuvad küsimused

Kui palju RAM-i vajab PostgreSQL?

Piisavalt, et sageli loetavad andmed mahuksid mällu. Äritarkvara käivitamisel piisab 4 GB-st, andmebaas ja rakendus kaasa arvatud. Seejärel mõõtke vahemälust lugemise määra: seni kuni see püsib üle 99 %, on mälu piisav.

Milline väärtus valida shared_buffers jaoks?

25 % mälust andmebaasile pühendatud serveris, nagu soovitab PostgreSQL-i dokumentatsioon: 1 GB 4 GB serveris, 2 GB 8 GB serveris, 4 GB 16 GB serveris. Üle 40 % muutub kasu haruldaseks, sest ülejäänu teeb ära süsteemi vahemälu.

Mitu PostgreSQL-i ühendust VPS talub?

PostgreSQL lubab vaikimisi 100 ja iga ühendus on protsess, mis tarbib mälu. Selle ülempiiri tõstmise asemel paigutage andmebaasi ette koondaja nagu PgBouncer: siis teenindavad mõnikümmend tegelikku ühendust sadu rakenduse ühendusi.

Kas andmebaas ja rakendus tuleks eraldada?

Käivitamisel mitte: samas serveris vastab andmebaas ilma võrgulatentsuseta ja kogu süsteemi saab varundada ühe tervikuna. Eraldatakse siis, kui üks segab teist, näiteks kui kompileerimine või liiklustipp tühjendab andmebaasi vahemälu.

Võtke meiega ühendust