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ę.
shared_buffers 25 % atminties, effective_cache_size 75 %, random_page_cost = 1.1 su NVMe SSD.pg_dump, už serverio ribų, ir reguliariai ją atkurkite, kad patikrintumėte.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:
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.
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.
| Parametras | 4 GB | 8 GB | 16 GB | Paskirtis |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | Paties PostgreSQL podėlis |
effective_cache_size | 3 GB | 6 GB | 12 GB | Numatomas bendras podėlis, kuris lemia užklausų planų pasirinkimą |
work_mem | 8 MB | 16 MB | 32 MB | Kiekvienos rikiavimo ar maišos operacijos atmintis, vienai jungčiai: dauginti iš vienu metu vykdomų užklausų |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Indeksų kūrimas ir VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Numatomos 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ė.
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 %:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS podelio_dalis
FROM pg_stat_database
WHERE datname = current_database();
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.
PostgreSQL serverio diske saugoma daugiau nei lentelės:
max_wal_size), daugiau masinio importo metu ir dar daugiau, jei žurnalo archyvavimas vėluoja.work_mem viršijančios rikiavimo operacijos.VACUUM FULL ir indekso perkūrimas įrašo visą kopiją prieš atlaisvindami senąją.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.
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ą:
shared_preload_libraries = 'pg_stat_statements'
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;
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.
listen_addresses = 'localhost', kol jungiasi tik serverio programa. Jei prieiga reikalinga kitam serveriui, atverkite 5432 prievadą tik jo adresui, ugniasienėje ir pg_hba.conf faile.scram-sha-256 metodas pg_hba.conf faile, po vieną vaidmenį kiekvienai programai, be supervartotojo teisių.pg_dump, nukopijuota už serverio ribų.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
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ą.
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.
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.
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ų.
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į.
Simafri
Pakalbėkime apie jūsų sumanymą
Pasakykite mums keliais žodžiais, ko jums reikia: greitai jums atsakome.
Ačiū! Jūsų užklausa išsiųsta. Netrukus su jumis susisieksime.
Labiau mėgstate el. paštą? Rašykite mums adresu support@simafri.com.