PostgreSQL na VPS: kako dimenzionirati pomnilnik in disk

Hitra podatkovna zbirka PostgreSQL je zbirka, katere pogosto brani podatki so v pomnilniku. Iz tega izhaja vse dimenzioniranje: obseg zbirke, del, ki zares dela, število povezav, nato disk in njegova rezerva. Ta vodnik poda metodo, začetne nastavitve za 4, 8 in 16 GB pomnilnika in poizvedbe, ki izmerijo obstoječo zbirko.

Objavljeno 29. oktobra 2026 Avtor: Čas branja: 10 minut

Vsi vodniki

Na kratko

  1. Izmerite obseg zbirke in njenih indeksov, nato del, ki se pogosto bere: prav ta mora biti v pomnilniku.
  2. Izhodišče: shared_buffers na 25 % pomnilnika, effective_cache_size na 75 %, random_page_cost = 1.1 na NVMe SSD.
  3. Vsaka povezava je proces: pri več kot nekaj deset aktivnih povezavah pred zbirko postavite PgBouncer.
  4. Disk: podatki in indeksi čez eno leto, plus vsaj 30 % rezerve. Poln disk ustavi PostgreSQL.
  5. Delež branj iz predpomnilnika mora ostati nad 99 %: pod to mejo zbirki primanjkuje pomnilnika.
  6. Vsak dan naredite varnostno kopijo z pg_dump, zunaj strežnika, in jo redno obnovite, da jo preverite.

Izhodišče je uporabni obseg

Pomnilnik strežnika podatkovne zbirke služi najprej kot predpomnilnik: stran, prebrana iz pomnilnika, se postreže veliko hitreje kot stran, prebrana z diska, tudi NVMe. Vprašanje torej ni le „koliko tehta zbirka?“, temveč „kolikšen del se bere pogosto?“. Zbirka s 50 GB, pri kateri se bere le zadnjih dvanajst mesecev, morda dela z 8 GB.

Na obstoječi zbirki dve poizvedbi dasta skupni obseg in največje tabele, skupaj z indeksi:

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

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

Za prihodnjo zbirko ocenite tabelo za tabelo: pričakovano število vrstic čez eno leto × povprečna velikost vrstice, nato dodajte indekse, ki pogosto tehtajo od 30 do 100 % podatkov. Primer: 2 milijona vrstic na mesec, po 500 bajtov, pomeni 12 GB podatkov čez eno leto in od 18 do 24 GB z indeksi.

Pomnilnik: začetne nastavitve

PostgreSQL prebrane strani hrani na dveh ravneh: v lastnem predpomnilniku (shared_buffers) in v predpomnilniku datotek sistema. Njegova dokumentacija za shared_buffers na namenskem strežniku priporoča izhodišče 25 % pomnilnika in ugotavlja, da nad 40 % izboljšave postanejo redke: preostanek koristi predpomnilniku sistema in razvrščanju.

Parameter4 GB8 GB16 GBVloga
shared_buffers1 GB2 GB4 GBLastni predpomnilnik PostgreSQL
effective_cache_size3 GB6 GB12 GBOcenjeni skupni predpomnilnik, ki usmerja izbiro načrtov poizvedb
work_mem8 MB16 MB32 MBPomnilnik za vsako razvrščanje ali zgoščevanje, na povezavo: pomnožite s številom sočasnih poizvedb
maintenance_work_mem256 MB512 MB1 GBUstvarjanje indeksov in VACUUM
random_page_cost1.11.11.1Ocenjena zahtevnost naključnega branja: privzeto 4, precej nad dejansko zahtevnostjo na NVMe SSD

Te vrednosti predpostavljajo, da je zbirka na strežniku sama. Če poleg nje teče aplikacija, najprej odštejte njen pomnilnik (procesi, predpomnilnik, prevajanje) in odstotke uporabite na preostanku: strežnik z 8 GB, ki poganja aplikacijo s 3 GB, se nastavi kot zbirka s 5 GB.

postgresql.conf, za strežnik z 8 GB, namenjen podatkovni zbirki
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers začne veljati šele ob ponovnem zagonu PostgreSQL; drugi parametri se znova naložijo brez prekinitve, z SELECT pg_reload_conf();.

Ali pomnilnik zadošča, vam pove delež branj iz predpomnilnika. Pri poslovni aplikaciji ali spletni strani presega 99 %:

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

Povezave: vsaka je proces

PostgreSQL odpre po en proces na povezavo in jih privzeto sprejme 100 (max_connections). Vsak proces v mirovanju zasede nekaj megabajtov, več, ko razvršča ali zgoščuje podatke (work_mem, včasih večkrat v isti poizvedbi). Kdor max_connections dvigne na 500, da bi sledil zgovorni aplikaciji, strežnik izpostavi pomanjkanju pomnilnika ob prvi konici.

Pravi odgovor je združevalnik povezav: PgBouncer v načinu transaction omogoči, da si stotine povezav aplikacije delijo nekaj deset resničnih povezav. Ogrodja imajo tudi lasten bazen povezav (SQLAlchemy, Prisma, HikariCP): njegovo velikost nastavite glede na število vCPU strežnika podatkovne zbirke, ne glede na število uporabnikov.

Disk: obseg, rezerva in dnevnik

Disk strežnika PostgreSQL nosi več kot tabele:

Pravilo: obseg čez eno leto, plus vsaj 30 % rezerve. To ni udobje: ko se disk, ki nosi dnevnik transakcij, napolni, se PostgreSQL ustavi, da zaščiti svoje podatke. Spremljajte zasedenost in disk povečajte pred 80 %.

Kar zadeva zmogljivost, vsaka potrditev transakcije počaka na zapis dnevnika na disk: zakasnitev shrambe določi hitrost pisanja. Prav tu NVMe SSD naredi razliko, veliko bolj kot pri branju, ki ga že streže pomnilnik.

Procesor: ena poizvedba, eno jedro

Poizvedba PostgreSQL se izvaja na enem samem jedru, razen velikih branj, ki jih pogon paralelizira. Število vCPU torej določi število zahtevnih poizvedb, obdelanih hkrati: 2 vCPU zadoščata poslovni aplikaciji ob zagonu, od 4 do 8 pa ustreza zelo obremenjenim zbirkam in zahtevnim poročilom.

Preden dodate vCPU, poiščite poizvedbe, ki jih porabljajo. Razširitev pg_stat_statements jih razvrsti po skupnem času:

postgresql.conf, nato ponovni zagon
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Isti strežnik kot aplikacija ali ločen strežnik?

Ob zagonu je zbirka na istem strežniku kot aplikacija prava izbira: med njima ni omrežne zakasnitve, povezava poteka prek vtičnice Unix, varnostno kopirati in nadzirati je treba en sam strežnik. Ločimo ju, ko si tekmujeta za vire: prevajanje ali konica prometa, ki izprazni predpomnilnik zbirke, zbirka, ki za svoje podatke potrebuje ves pomnilnik, ali različne zahteve glede varnostnih kopij.

Varnost in varnostne kopije

Terminal: stisnjen izvoz, nato obnova v testno zbirko
pg_dump -Fc -d moja_zbirka -f moja_zbirka-$(date +%F).dump
createdb moja_zbirka_test
pg_restore -d moja_zbirka_test moja_zbirka-2026-10-29.dump

Hitra podatkovna zbirka PostgreSQL na pravem strežniku

VPS Pro teče na procesorjih Intel Xeon, pomnilniku ECC, ki napake popravlja sproti, in zrcaljenih NVMe SSD, pri čemer je vsak blok podatkov preverjen s kontrolno vsoto, varnostna kopija pa vsako noč šifrirana in shranjena zunaj stroja. Celovita podpora je vključena: ko se vaša zbirka upočasni, analiziramo počasne poizvedbe in indekse, nato pa vam pokažemo nastavitve, ki vaši aplikaciji vrnejo hitrost.

Odkrijte VPS Pro

Pogosta vprašanja

Koliko RAM-a za PostgreSQL?

Dovolj, da so pogosto brani podatki v pomnilniku. Za poslovno aplikacijo ob zagonu zadoščajo 4 GB, skupaj za zbirko in aplikacijo. Nato merite delež branj iz predpomnilnika: dokler ostaja nad 99 %, pomnilnik zadošča.

Kakšna vrednost za shared_buffers?

25 % pomnilnika na strežniku, namenjenem podatkovni zbirki, kot priporoča dokumentacija PostgreSQL: 1 GB pri 4 GB, 2 GB pri 8 GB, 4 GB pri 16 GB. Nad 40 % izboljšave postanejo redke, saj preostanek opravi predpomnilnik sistema.

Koliko povezav PostgreSQL lahko sprejme VPS?

PostgreSQL jih privzeto sprejme 100, vsaka povezava pa je proces, ki porablja pomnilnik. Namesto da to zgornjo mejo dvignete, pred zbirko postavite združevalnik povezav, kot je PgBouncer: nekaj deset resničnih povezav tedaj postreže stotine povezav aplikacije.

Ali je treba podatkovno zbirko in aplikacijo ločiti?

Ob zagonu ostaneta skupaj: na istem strežniku zbirka odgovarja brez omrežne zakasnitve, celota pa se varnostno kopira v enem kosu. Ločimo ju, ko ena ovira drugo, na primer ko prevajanje ali konica prometa izprazni predpomnilnik zbirke.

Stopite v stik z nami