PostgreSQL VPS-palvelimella: muistin ja levyn mitoitus

Nopea PostgreSQL-tietokanta on tietokanta, jonka usein luettu data mahtuu muistiin. Koko mitoitus lähtee tästä: tietokannan koko, sen todella käytössä oleva osa, yhteyksien määrä ja sitten levy ja sen marginaali. Tämä opas antaa menetelmän, lähtöasetukset 4, 8 ja 16 gigatavun muistille sekä kyselyt, joilla olemassa oleva tietokanta mitataan.

Julkaistu 29. lokakuuta 2026 Kirjoittaja: Lukuaika: 10 minuuttia

Kaikki oppaat

Lyhyesti

  1. Mitatkaa tietokannan ja sen indeksien koko ja sitten usein luettu osa: juuri sen on mahduttava muistiin.
  2. Lähtökohta: shared_buffers 25 % muistista, effective_cache_size 75 %, random_page_cost = 1.1 NVMe-SSD-levyllä.
  3. Jokainen yhteys on prosessi: kun aktiivisia yhteyksiä on enemmän kuin muutama kymmenen, sijoittakaa PgBouncer tietokannan eteen.
  4. Levy: data ja indeksit vuoden päästä ja vähintään 30 %:n marginaali. Täysi levy pysäyttää PostgreSQL:n.
  5. Välimuistista luettujen sivujen osuuden on pysyttävä yli 99 %:ssa: sen alapuolella tietokannalta puuttuu muistia.
  6. Varmuuskopioikaa joka päivä pg_dump-komennolla palvelimen ulkopuolelle ja palauttakaa säännöllisesti varmistaaksenne, että kopio toimii.

Lähtökohtana käytössä oleva data

Tietokantapalvelimen muisti toimii ennen kaikkea välimuistina: muistista luettu sivu palvellaan paljon nopeammin kuin levyltä luettu, NVMe-levyltäkin. Kysymys ei siis ole vain ”paljonko tietokanta vie tilaa?”, vaan ”mikä osa siitä luetaan usein?”. 50 GB:n tietokanta, josta luetaan vain viimeiset kaksitoista kuukautta, työskentelee ehkä 8 gigatavun varassa.

Olemassa olevasta tietokannasta kaksi kyselyä kertoo kokonaiskoon ja suurimmat taulut indekseineen:

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

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

Tulevan tietokannan koko arvioidaan taulu kerrallaan: vuoden päästä odotettu rivimäärä × rivin keskikoko, ja siihen lisätään indeksit, jotka ovat yleisesti 30 ja 100 %:n välillä datan koosta. Esimerkki: 2 miljoonaa riviä kuukaudessa, kukin 500 tavua, tekee vuoden päästä 12 GB dataa ja indekseineen 18 ja 24 GB:n välillä.

Muisti: lähtöasetukset

PostgreSQL pitää luetut sivut kahdella tasolla: omassa välimuistissaan (shared_buffers) ja järjestelmän tiedostovälimuistissa. Sen dokumentaatio suosittelee lähtökohdaksi 25 % muistista shared_buffers-asetukselle tietokannalle omistetulla palvelimella ja toteaa, että yli 40 %:n osuudesta on harvoin lisähyötyä: loput muistista hyödyttää järjestelmän välimuistia ja lajitteluja.

Parametri4 GB8 GB16 GBTehtävä
shared_buffers1 GB2 GB4 GBPostgreSQL:n oma välimuisti
effective_cache_size3 GB6 GB12 GBArvioitu välimuistin kokonaiskoko, joka ohjaa kyselysuunnitelmien valintaa
work_mem8 MB16 MB32 MBJokaisen lajittelun tai hajautuksen muisti yhteyttä kohden: kerrotaan samanaikaisten kyselyjen määrällä
maintenance_work_mem256 MB512 MB1 GBIndeksien luonti ja VACUUM
random_page_cost1.11.11.1Satunnaisen levyluvun arvioitu kustannus: oletuksena 4, selvästi yli todellisen kustannuksen NVMe-SSD-levyllä

Nämä arvot olettavat, että tietokanta on palvelimella yksin. Jos sovellus toimii samalla palvelimella, vähentäkää ensin sen muisti (prosessit, välimuisti, käännös) ja soveltakaa prosenttiosuuksia jäljelle jäävään: 8 GB:n palvelin, joka ajaa 3 GB:n sovellusta, säädetään kuin 5 GB:n tietokantapalvelin.

postgresql.conf, tietokannalle omistettu 8 GB:n palvelin
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers tulee voimaan vasta, kun PostgreSQL käynnistetään uudelleen; muut parametrit ladataan uudelleen ilman katkoa komennolla SELECT pg_reload_conf();.

Muistin riittävyyden kertoo välimuistista luettujen sivujen osuus. Liiketoimintasovelluksessa tai sivustossa se on yli 99 %:

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

Yhteydet: jokaiselle oma prosessi

PostgreSQL avaa yhden prosessin yhteyttä kohden ja hyväksyy oletuksena 100 yhteyttä (max_connections). Jokainen prosessi vie levossa muutaman megatavun, enemmän lajitellessaan tai hajauttaessaan dataa (work_mem, joskus useita kertoja saman kyselyn aikana). Jos max_connections nostetaan 500:aan puheliaan sovelluksen tarpeisiin, palvelimen muisti voi loppua ensimmäisessä piikissä.

Oikea ratkaisu on yhteyspooli: transaction-tilassa toimiva PgBouncer jakaa muutaman kymmenen todellisen yhteyden sovelluksen satojen yhteyksien kesken. Sovelluskehyksillä on myös oma poolinsa (SQLAlchemy, Prisma, HikariCP): säätäkää sen koko tietokantapalvelimen vCPU:iden määrän eikä käyttäjien määrän mukaan.

Levy: koko, marginaali ja transaktioloki

PostgreSQL-palvelimen levyllä on muutakin kuin taulut:

Sääntö: koko vuoden päästä ja vähintään 30 %:n marginaali. Kyse on toimintavarmuudesta: kun transaktiolokia säilyttävä levy täyttyy, PostgreSQL pysähtyy suojellakseen dataansa. Seuratkaa käyttöastetta ja laajentakaa ennen kuin se ylittää 80 %.

Suorituskyvyn kannalta jokainen transaktion vahvistus odottaa lokin kirjoittamista levylle: tallennustilan viive määrää kirjoitusten läpäisyn. Juuri tässä NVMe-SSD tekee eron, paljon enemmän kuin luvuissa, jotka muisti jo palvelee.

Suoritin: yksi kysely, yksi ydin

PostgreSQL-kysely suoritetaan yhdellä ytimellä lukuun ottamatta suuria lukuja, jotka moottori rinnakkaistaa. vCPU:iden määrä ratkaisee siis, montako raskasta kyselyä käsitellään yhtä aikaa: 2 vCPU:ta riittää liiketoimintasovellukselle julkaisuvaiheessa, ja kovassa käytössä oleville tietokannoille ja raskaille raporteille sopii 4 tai 8 vCPU:ta.

Ennen kuin lisäätte vCPU:ita, etsikää kyselyt, jotka niitä kuluttavat. Laajennus pg_stat_statements järjestää ne kokonaisajan mukaan:

postgresql.conf, sitten uudelleenkäynnistys
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Sama palvelin kuin sovelluksella vai erillinen palvelin?

Julkaisuvaiheessa tietokanta samalla palvelimella sovelluksen kanssa on oikea valinta: niiden välillä ei ole verkkoviivettä, yhteys kulkee Unix-socketin kautta, ja varmuuskopioitavana ja valvottavana on yksi palvelin. Ne erotetaan, kun ne kilpailevat resursseista: käännös tai liikennepiikki tyhjentää tietokannan välimuistin, tietokanta tarvitsee koko muistin datalleen tai varmuuskopiointivaatimukset eroavat.

Tietoturva ja varmuuskopiot

Pääte: pakattu vienti ja palautus testitietokantaan
pg_dump -Fc -d oma_kanta -f oma_kanta-$(date +%F).dump
createdb oma_kanta_testi
pg_restore -d oma_kanta_testi oma_kanta-2026-10-29.dump

Nopea PostgreSQL-tietokanta oikealla palvelimella

VPS Pro toimii Intel Xeon -suorittimilla, ECC-muistilla, joka korjaa virheet lennossa, ja peilatuilla NVMe-SSD-levyillä; jokainen datalohko varmennetaan tarkistussummalla, ja salattu varmuuskopio otetaan joka yö koneen ulkopuolelle. Kokonaistuki sisältyy: kun tietokantanne hidastuu, analysoimme hitaat kyselyt ja indeksit ja kerromme sitten asetukset, jotka palauttavat sovelluksenne nopeuden.

Katso VPS Pro

Usein kysytyt kysymykset

Paljonko RAM-muistia PostgreSQL tarvitsee?

Sen verran, että usein luettu data mahtuu muistiin. Liiketoimintasovellukselle julkaisuvaiheessa 4 GB riittää tietokanta ja sovellus mukaan lukien. Sen jälkeen mitatkaa välimuistista luettujen sivujen osuus: niin kauan kuin se pysyy yli 99 %:ssa, muisti riittää.

Mikä arvo shared_buffers-asetukselle?

25 % muistista tietokannalle omistetulla palvelimella, kuten PostgreSQL:n dokumentaatio suosittelee: 1 GB 4 gigatavusta, 2 GB 8 gigatavusta, 4 GB 16 gigatavusta. Yli 40 %:n osuudesta on harvoin lisähyötyä, koska järjestelmän välimuisti hoitaa loput.

Montako PostgreSQL-yhteyttä VPS voi ottaa vastaan?

PostgreSQL hyväksyy oletuksena 100 yhteyttä, ja jokainen yhteys on muistia kuluttava prosessi. Katon nostamisen sijaan sijoittakaa PgBouncerin kaltainen yhteyspooli tietokannan eteen: muutama kymmenen todellista yhteyttä palvelee silloin sovelluksen satoja yhteyksiä.

Pitääkö tietokanta ja sovellus erottaa toisistaan?

Julkaisuvaiheessa sama palvelin on paras valinta: tietokanta vastaa ilman verkkoviivettä, ja kokonaisuus varmuuskopioidaan yhtenä. Ne erotetaan, kun toinen haittaa toista, esimerkiksi kun käännös tai liikennepiikki tyhjentää tietokannan välimuistin.

Ota yhteyttä