PostgreSQL na VPS-u: kako dimenzionirati memoriju i disk

Brza PostgreSQL baza je baza čiji često čitani podaci stanu u memoriju. Iz toga proizlazi cijelo dimenzioniranje: veličina baze, dio koji se stvarno koristi, broj veza, zatim disk i njegova rezerva. Ovaj vodič daje metodu, početne postavke za 4, 8 i 16 GB memorije i upite koji mjere postojeću bazu.

Objavljeno 29. listopada 2026. Autor: Vrijeme čitanja: 10 minuta

Svi vodiči

Najvažnije

  1. Izmjerite veličinu baze i njezinih indeksa, a zatim dio koji se često čita: on mora stati u memoriju.
  2. Polazna točka: shared_buffers na 25 % memorije, effective_cache_size na 75 %, random_page_cost = 1.1 na NVMe SSD-u.
  3. Svaka je veza jedan proces: iznad nekoliko desetaka aktivnih veza postavite PgBouncer ispred baze.
  4. Disk: podaci i indeksi za godinu dana, plus najmanje 30 % rezerve. Pun disk zaustavlja PostgreSQL.
  5. Udio čitanja iz predmemorije mora ostati iznad 99 %: ispod toga bazi nedostaje memorije.
  6. Izrađujte sigurnosnu kopiju svaki dan naredbom pg_dump, izvan poslužitelja, i redovito je vraćajte kako biste je provjerili.

Polazite od korisnog volumena

Memorija poslužitelja baze podataka prije svega služi kao predmemorija: stranica pročitana iz memorije poslužuje se mnogo brže od stranice pročitane s diska, čak i NVMe. Pitanje zato nije samo „koliko je baza velika?”, nego „koji se njezin dio često čita?”. Baza od 50 GB u kojoj se pretražuje samo posljednjih dvanaest mjeseci možda radi na 8 GB.

Na postojećoj bazi dva upita daju ukupnu veličinu i najveće tablice, uključujući indekse:

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

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

Za bazu koja tek dolazi procijenite tablicu po tablicu: broj redaka očekivan za godinu dana × prosječna veličina retka, a zatim dodajte indekse, koji obično teže 30 do 100 % podataka. Primjer: 2 milijuna redaka mjesečno, svaki od 500 bajtova, čini 12 GB podataka za godinu dana, a 18 do 24 GB s indeksima.

Memorija: početne postavke

PostgreSQL pročitane stranice drži na dvije razine: u vlastitoj predmemoriji (shared_buffers) i u predmemoriji datoteka operativnog sustava. Njegova dokumentacija preporučuje da se na poslužitelju namijenjenom bazi za shared_buffers krene od 25 % memorije i napominje da je iznad 40 % dobitak rijedak: ostatak koristi predmemoriji sustava i sortiranjima.

Parametar4 GB8 GB16 GBUloga
shared_buffers1 GB2 GB4 GBVlastita predmemorija PostgreSQL-a
effective_cache_size3 GB6 GB12 GBProcijenjena ukupna predmemorija, koja usmjerava odabir planova izvršavanja upita
work_mem8 MB16 MB32 MBMemorija svakog sortiranja ili hashiranja, po vezi: treba je pomnožiti s brojem istovremenih upita
maintenance_work_mem256 MB512 MB1 GBIzrada indeksa i VACUUM
random_page_cost1.11.11.1Procijenjeni trošak nasumičnog čitanja: 4 prema zadanim postavkama, znatno iznad stvarnog troška na NVMe SSD-u

Ove vrijednosti pretpostavljaju da je baza sama na poslužitelju. Ako uz nju radi i aplikacija, najprije oduzmite njezinu memoriju (procesi, predmemorija, kompilacija) i postotke primijenite na ostatak: poslužitelj od 8 GB na kojem radi aplikacija od 3 GB podešava se kao baza od 5 GB.

postgresql.conf, za poslužitelj od 8 GB namijenjen bazi
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers počinje djelovati tek nakon ponovnog pokretanja PostgreSQL-a; ostali se parametri učitavaju bez prekida, naredbom SELECT pg_reload_conf();.

Da biste znali je li memorija dovoljna, pogledajte udio čitanja iz predmemorije. Kod poslovne aplikacije ili web stranice on prelazi 99 %:

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

Veze: svaka je jedan proces

PostgreSQL otvara jedan proces po vezi i prema zadanim postavkama prihvaća njih 100 (max_connections). Svaki proces u mirovanju zauzima nekoliko megabajta, a više kada sortira ili hashira podatke (work_mem, ponekad više puta unutar istog upita). Povećati max_connections na 500 kako bi se pratila „brbljava” aplikacija znači izložiti poslužitelj nedostatku memorije već pri prvom vrhu opterećenja.

Pravi je odgovor alat za grupiranje veza (connection pooler): PgBouncer, u načinu rada transaction, omogućuje da stotine veza aplikacije dijele nekoliko desetaka stvarnih veza. Razvojni okviri imaju i vlastiti pool (SQLAlchemy, Prisma, HikariCP): njegovu veličinu podesite prema broju vCPU-a poslužitelja baze, a ne prema broju korisnika.

Disk: volumen, rezerva i dnevnik transakcija

Disk PostgreSQL poslužitelja nosi više od samih tablica:

Pravilo: volumen za godinu dana, plus najmanje 30 % rezerve. To nije stvar udobnosti: kada se disk na kojem je dnevnik transakcija napuni, PostgreSQL se zaustavlja kako bi zaštitio svoje podatke. Pratite zauzeće i proširite disk prije 80 %.

Što se performansi tiče, svaka potvrda transakcije čeka zapis dnevnika na disk: latencija pohrane određuje propusnost pisanja. Tu NVMe SSD čini razliku, mnogo više nego kod čitanja, koja već poslužuje memorija.

Procesor: jedan upit, jedna jezgra

PostgreSQL upit izvršava se na jednoj jezgri, osim velikih čitanja koja pogon paralelizira. Broj vCPU-a stoga određuje koliko se zahtjevnih upita obrađuje u isto vrijeme: 2 vCPU-a dovoljna su poslovnoj aplikaciji pri pokretanju, a 4 do 8 odgovaraju vrlo opterećenim bazama i zahtjevnim izvješćima.

Prije dodavanja vCPU-a pronađite upite koji ih troše. Proširenje pg_stat_statements razvrstava ih prema ukupnom vremenu:

postgresql.conf, zatim ponovno pokretanje
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Isti poslužitelj kao aplikacija ili zaseban poslužitelj?

Pri pokretanju baza na istom poslužitelju kao aplikacija pravi je izbor: između njih nema mrežne latencije, veza ide preko Unix socketa, a sigurnosno kopiranje i nadzor odnose se na jedan poslužitelj. Razdvajaju se kada se natječu za resurse: kompilacija ili vrh prometa koji isprazni predmemoriju baze, baza kojoj je za podatke potrebna sva memorija ili različiti zahtjevi za sigurnosne kopije.

Sigurnost i sigurnosne kopije

Terminal: komprimirani izvoz, zatim vraćanje u testnu bazu
pg_dump -Fc -d moja_baza -f moja_baza-$(date +%F).dump
createdb moja_baza_test
pg_restore -d moja_baza_test moja_baza-2026-10-29.dump

Brza PostgreSQL baza, na pravom poslužitelju

VPS Pro radi na procesorima Intel Xeon, ECC memoriji koja ispravlja pogreške u hodu i zrcaljenim NVMe SSD-ovima, pri čemu je svaki blok podataka provjeren kontrolnim zbrojem, uz šifriranu sigurnosnu kopiju svake noći, izvan stroja. Cjelovita podrška je uključena: kada vaša baza uspori, analiziramo spore upite i indekse, a zatim vam pokazujemo postavke koje vašoj aplikaciji vraćaju brzinu.

Otkrijte VPS Pro

Česta pitanja

Koliko RAM-a za PostgreSQL?

Dovoljno da često čitani podaci stanu u memoriju. Za poslovnu aplikaciju pri pokretanju dovoljna su 4 GB, uključujući bazu i aplikaciju. Zatim mjerite udio čitanja iz predmemorije: dok god ostaje iznad 99 %, memorija je dovoljna.

Koju vrijednost postaviti za shared_buffers?

25 % memorije na poslužitelju namijenjenom bazi, kako preporučuje dokumentacija PostgreSQL-a: 1 GB na 4 GB, 2 GB na 8 GB, 4 GB na 16 GB. Iznad 40 % dobitak postaje rijedak, jer ostatak obavlja predmemorija sustava.

Koliko PostgreSQL veza može prihvatiti VPS?

PostgreSQL prema zadanim postavkama prihvaća njih 100, a svaka je veza proces koji troši memoriju. Umjesto povećanja te granice, postavite alat za grupiranje veza poput PgBouncera ispred baze: nekoliko desetaka stvarnih veza tada poslužuje stotine veza aplikacije.

Treba li razdvojiti bazu podataka i aplikaciju?

Ne pri pokretanju: na istom poslužitelju baza odgovara bez mrežne latencije, a sve se sigurnosno kopira zajedno. Razdvajaju se kada jedna smeta drugoj, primjerice kada kompilacija ili vrh prometa isprazni predmemoriju baze.

Kontaktirajte nas