PostgreSQL VPS serveryje: kaip parinkti atmintį ir diską

Greita PostgreSQL duomenų bazė yra ta, kurios dažnai naudojami duomenys telpa atmintyje. Nuo to ir prasideda visas dydžio parinkimas: duomenų bazės apimtis, dalis, kuri iš tikrųjų dirba, jungčių skaičius, tada diskas ir jo atsarga. Šis gidas pateikia metodą, pradinius nustatymus 4, 8 ir 16 GB atminčiai ir užklausas, kurios išmatuoja esamą duomenų bazę.

Paskelbta 2026 m. spalio 29 d. Autorius: Skaitymo trukmė: 10 min.

Visi gidai

Svarbiausia

  1. Išmatuokite duomenų bazės ir jos indeksų apimtį, tada dažnai naudojamą dalį: būtent ji turi tilpti atmintyje.
  2. Atspirties taškas: shared_buffers 25 % atminties, effective_cache_size 75 %, random_page_cost = 1.1 su NVMe SSD.
  3. Kiekviena jungtis yra procesas: kai aktyvių jungčių daugiau nei kelios dešimtys, prieš duomenų bazę pastatykite PgBouncer.
  4. Diskas: duomenys ir indeksai po metų, plius mažiausiai 30 % atsarga. Pilnas diskas sustabdo PostgreSQL.
  5. Skaitymų iš podėlio dalis turi išlikti virš 99 %: jei ji mažesnė, duomenų bazei trūksta atminties.
  6. Kasdien darykite atsarginę kopiją su pg_dump, už serverio ribų, ir reguliariai ją atkurkite, kad patikrintumėte.

Pradėti nuo naudingos apimties

Duomenų bazės serverio atmintis pirmiausia tarnauja kaip podėlis: iš atminties perskaitytas puslapis pateikiamas daug greičiau nei perskaitytas iš disko, net ir NVMe. Todėl klausimas yra ne tik „kiek sveria duomenų bazė?“, bet ir „kokia jos dalis skaitoma dažnai?“. 50 GB duomenų bazė, kurioje naudojami tik paskutinių dvylikos mėnesių duomenys, galbūt dirba su 8 GB.

Esamoje duomenų bazėje dvi užklausos parodo visą apimtį ir didžiausias lenteles, įskaitant indeksus:

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

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

Būsimai duomenų bazei vertinkite lentelę po lentelės: laukiamas eilučių skaičius po metų × vidutinis eilutės dydis, tada pridėkite indeksus, kurie paprastai sudaro nuo 30 iki 100 % duomenų. Pavyzdys: 2 milijonai eilučių per mėnesį, po 500 baitų kiekviena, per metus sudaro 12 GB duomenų, o su indeksais nuo 18 iki 24 GB.

Atmintis: pradiniai nustatymai

PostgreSQL perskaitytus puslapius laiko dviem lygiais: savo podėlyje (shared_buffers) ir sistemos failų podėlyje. Jo dokumentacija rekomenduoja serveryje, skirtame tik duomenų bazei, shared_buffers pradėti nuo 25 % atminties ir pastebi, kad virš 40 % nauda tampa reta: likusi dalis tenka sistemos podėliui ir rikiavimui.

Parametras4 GB8 GB16 GBPaskirtis
shared_buffers1 GB2 GB4 GBPaties PostgreSQL podėlis
effective_cache_size3 GB6 GB12 GBNumatomas bendras podėlis, kuris lemia užklausų planų pasirinkimą
work_mem8 MB16 MB32 MBKiekvienos rikiavimo ar maišos operacijos atmintis, vienai jungčiai: dauginti iš vienu metu vykdomų užklausų
maintenance_work_mem256 MB512 MB1 GBIndeksų kūrimas ir VACUUM
random_page_cost1.11.11.1Numatomos atsitiktinio skaitymo sąnaudos: pagal numatytuosius nustatymus 4, gerokai daugiau nei tikrosios sąnaudos su NVMe SSD

Šios reikšmės numato, kad serveryje veikia tik duomenų bazė. Jei šalia veikia programa, pirmiausia atimkite jos atmintį (procesus, podėlį, kompiliavimą) ir procentus taikykite likučiui: 8 GB serveris, kuriame veikia 3 GB programa, nustatomas kaip 5 GB duomenų bazė.

postgresql.conf, 8 GB serveriui, skirtam tik duomenų bazei
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers įsigalioja tik perkrovus PostgreSQL; kiti parametrai įkeliami iš naujo be pertrūkio, komanda SELECT pg_reload_conf();.

Norėdami sužinoti, ar atminties pakanka, žiūrėkite skaitymų iš podėlio dalį. Verslo valdymo programoje ar svetainėje ji viršija 99 %:

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

Jungtys: kiekvienai po procesą

PostgreSQL kiekvienai jungčiai atidaro procesą ir pagal numatytuosius nustatymus priima 100 jungčių (max_connections). Kiekvienas procesas ramybės būsenoje užima kelis megabaitus, daugiau, kai rikiuoja ar maišo duomenis (work_mem, kartais kelis kartus toje pačioje užklausoje). Padidinti max_connections iki 500, kad atlaikytumėte daug jungčių atidarančią programą, reiškia rizikuoti, kad serveriui pritrūks atminties per pirmąjį piką.

Teisingas atsakymas yra jungčių telkimo įrankis: PgBouncer transaction režimu leidžia šimtams programos jungčių dalytis keliomis dešimtimis tikrų jungčių. Karkasai taip pat turi savo telkinį (SQLAlchemy, Prisma, HikariCP): jo dydį derinkite prie duomenų bazės serverio vCPU skaičiaus, o ne prie vartotojų skaičiaus.

Diskas: apimtis, atsarga ir žurnalas

PostgreSQL serverio diske saugoma daugiau nei lentelės:

Taisyklė: apimtis po metų, plius mažiausiai 30 % atsarga. Tai ne patogumo klausimas: kai prisipildo diskas, kuriame yra transakcijų žurnalas, PostgreSQL sustoja, kad apsaugotų savo duomenis. Stebėkite užimtumą ir didinkite diską, kol jis nepasiekė 80 %.

Našumo požiūriu kiekvienas transakcijos patvirtinimas laukia, kol žurnalas bus įrašytas į diską: saugyklos delsa lemia rašymo spartą. Būtent čia NVMe SSD daro skirtumą, daug labiau nei skaitymui, kurį jau aptarnauja atmintis.

Procesorius: viena užklausa, vienas branduolys

PostgreSQL užklausa vykdoma viename branduolyje, išskyrus didelius skaitymus, kuriuos variklis lygiagretina. Todėl vCPU skaičius lemia, kiek sunkių užklausų apdorojama vienu metu: 2 vCPU pakanka verslo valdymo programai paleidimo metu, nuo 4 iki 8 tinka labai apkrautoms duomenų bazėms ir sunkioms ataskaitoms.

Prieš pridėdami vCPU, suraskite užklausas, kurios juos naudoja. Plėtinys pg_stat_statements jas surikiuoja pagal bendrą laiką:

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

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

Tas pats serveris kaip programa ar atskiras serveris?

Paleidimo metu duomenų bazė tame pačiame serveryje kaip programa yra teisingas pasirinkimas: jokios tinklo delsos tarp jų, jungtis per Unix lizdą (socket), vienas serveris, kurį reikia kopijuoti ir stebėti. Atskiriama tada, kai jos konkuruoja dėl išteklių: kompiliavimas ar srauto pikas, išvalantis duomenų bazės podėlį, duomenų bazė, kuriai duomenims reikia visos atminties, ar skirtingi atsarginių kopijų reikalavimai.

Saugumas ir atsarginės kopijos

Terminalas: suglaudintas eksportas, tada atkūrimas testinėje duomenų bazėje
pg_dump -Fc -d mano_db -f mano_db-$(date +%F).dump
createdb mano_db_test
pg_restore -d mano_db_test mano_db-2026-10-29.dump

Greita PostgreSQL duomenų bazė tinkamame serveryje

VPS Pro veikia su Intel Xeon procesoriais, ECC atmintimi, kuri realiu laiku ištaiso klaidas, ir veidrodiniais NVMe SSD; kiekvienas duomenų blokas tikrinamas kontroline suma, o šifruota atsarginė kopija kiekvieną naktį daroma už mašinos ribų. Visapusiška pagalba įskaičiuota: kai jūsų duomenų bazė sulėtėja, analizuojame lėtas užklausas ir indeksus, tada nurodome nustatymus, kurie grąžina jūsų programai spartą.

Žiūrėti VPS Pro

Dažni klausimai

Kiek RAM reikia PostgreSQL?

Tiek, kad dažnai naudojami duomenys tilptų atmintyje. Verslo valdymo programai paleidimo metu pakanka 4 GB, įskaitant duomenų bazę ir programą. Vėliau matuokite skaitymų iš podėlio dalį: kol ji išlieka virš 99 %, atminties pakanka.

Kokią reikšmę nustatyti shared_buffers?

25 % atminties serveryje, skirtame tik duomenų bazei, kaip rekomenduoja PostgreSQL dokumentacija: 1 GB iš 4 GB, 2 GB iš 8 GB, 4 GB iš 16 GB. Virš 40 % nauda tampa reta, nes likusį darbą atlieka sistemos podėlis.

Kiek PostgreSQL jungčių gali priimti VPS?

Pagal numatytuosius nustatymus PostgreSQL priima 100, o kiekviena jungtis yra procesas, vartojantis atmintį. Užuot didinę šią ribą, prieš duomenų bazę pastatykite jungčių telkimo įrankį, pavyzdžiui, PgBouncer: tada kelios dešimtys tikrų jungčių aptarnauja šimtus programos jungčių.

Ar reikia atskirti duomenų bazę ir programą?

Paleidimo metu ne: tame pačiame serveryje duomenų bazė atsako be tinklo delsos, o visą sistemą galima kopijuoti kaip vieną visumą. Atskiriama tada, kai viena trukdo kitai, pavyzdžiui, kai kompiliavimas ar srauto pikas išvalo duomenų bazės podėlį.

Susisiekite su mumis