PostgreSQL VPS serverī: kā dimensionēt atmiņu un disku

Ātra PostgreSQL datubāze ir datubāze, kuras bieži lasītie dati ietilpst atmiņā. No tā izriet viss dimensionējums: datubāzes apjoms, daļa, kas patiešām tiek izmantota, savienojumu skaits, pēc tam disks un tā rezerve. Šajā ceļvedī ir metode, sākuma iestatījumi 4, 8 un 16 GB atmiņai un vaicājumi, kas izmēra esošu datubāzi.

Publicēts 2026. gada 29. oktobrī Autors: Lasīšanas laiks: 10 minūtes

Visi ceļveži

Galvenais

  1. Izmēriet datubāzes un tās indeksu apjomu, pēc tam bieži lasīto daļu: tieši tai jāietilpst atmiņā.
  2. Sākumpunkts: shared_buffers 25 % no atmiņas, effective_cache_size 75 %, random_page_cost = 1.1 uz NVMe SSD.
  3. Katrs savienojums ir process: ja aktīvo savienojumu ir vairāk par dažiem desmitiem, novietojiet datubāzes priekšā PgBouncer.
  4. Disks: dati un indeksi pēc gada, plus vismaz 30 % rezerve. Pilns disks aptur PostgreSQL.
  5. Kešatmiņas trāpījumu īpatsvaram jāpaliek virs 99 %: zemāk datubāzei trūkst atmiņas.
  6. Veidojiet rezerves kopiju katru dienu ar pg_dump, ārpus servera, un regulāri to atjaunojiet, lai pārbaudītu.

Sākt no izmantotā datu apjoma

Datubāzes servera atmiņa vispirms kalpo kā kešatmiņa: no atmiņas nolasītu lapu apkalpo daudz ātrāk nekā no diska, pat NVMe. Tāpēc jautājums nav tikai «cik liela ir datubāze?», bet «kāda daļa tiek lasīta bieži?». 50 GB datubāze, kurā skatās tikai pēdējos divpadsmit mēnešus, varbūt strādā ar 8 GB.

Esošā datubāzē divi vaicājumi parāda kopējo apjomu un lielākās tabulas, ieskaitot indeksus:

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

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

Topošai datubāzei aplēsiet pa tabulām: pēc gada gaidāmais rindu skaits × rindas vidējais izmērs, tad pieskaitiet indeksus, kas parasti sver 30 līdz 100 % no datiem. Piemērs: 2 miljoni rindu mēnesī, katra 500 baitu, pēc gada ir 12 GB datu un ar indeksiem 18 līdz 24 GB.

Atmiņa: sākuma iestatījumi

PostgreSQL nolasītās lapas glabā divos līmeņos: savā kešatmiņā (shared_buffers) un sistēmas failu kešatmiņā. Tā dokumentācija iesaka serverim, kas veltīts datubāzei, sākt ar shared_buffers 25 % apmērā no atmiņas un norāda, ka virs 40 % ieguvums kļūst rets: pārējais nāk par labu sistēmas kešatmiņai un kārtošanai.

Parametrs4 GB8 GB16 GBLoma
shared_buffers1 GB2 GB4 GBPostgreSQL pašas kešatmiņa
effective_cache_size3 GB6 GB12 GBAplēstā kopējā kešatmiņa, kas ietekmē vaicājumu plānu izvēli
work_mem8 MB16 MB32 MBAtmiņa katrai kārtošanas vai heša operācijai, uz savienojumu: jāreizina ar vienlaicīgo vaicājumu skaitu
maintenance_work_mem256 MB512 MB1 GBIndeksu izveide un VACUUM
random_page_cost1.11.11.1Nejaušas nolasīšanas aplēstās izmaksas: pēc noklusējuma 4, krietni virs reālajām izmaksām uz NVMe SSD

Šīs vērtības pieņem, ka datubāze serverī ir viena pati. Ja blakus darbojas lietojumprogramma, vispirms atskaitiet tās atmiņu (procesi, kešatmiņa, kompilēšana) un procentus piemērojiet atlikumam: 8 GB serveri, kurā darbojas 3 GB lietojumprogramma, iestata kā 5 GB datubāzes serveri.

postgresql.conf 8 GB serverim, kas veltīts datubāzei
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers stājas spēkā tikai pēc PostgreSQL restartēšanas; pārējos parametrus var pārlādēt bez pārtraukuma ar SELECT pg_reload_conf();.

Lai uzzinātu, vai atmiņas pietiek, skatieties kešatmiņas trāpījumu īpatsvaru. Biznesa lietojumprogrammā vai vietnē tas pārsniedz 99 %:

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

Savienojumi: katram savs process

PostgreSQL atver vienu procesu uz katru savienojumu un pēc noklusējuma pieņem 100 (max_connections). Katrs process dīkstāvē aizņem dažus megabaitus, vairāk, kad kārto vai jauc datus (work_mem, dažkārt vairākas reizes vienā vaicājumā). Palielināt max_connections līdz 500, lai sekotu runīgai lietojumprogrammai, nozīmē pakļaut serveri atmiņas trūkumam jau pirmajā slodzes maksimumā.

Pareizā atbilde ir savienojumu apvienotājs (connection pooler): PgBouncer transaction režīmā ļauj simtiem lietojumprogrammas savienojumu dalīt dažus desmitus reālu savienojumu. Ietvariem ir arī savs pūls (SQLAlchemy, Prisma, HikariCP): iestatiet tā izmēru pēc datubāzes servera vCPU skaita, nevis pēc lietotāju skaita.

Disks: apjoms, rezerve un žurnāls

PostgreSQL servera diskā glabājas vairāk nekā tabulas:

Noteikums: apjoms pēc gada, plus vismaz 30 % rezerve. Tā nav ērtība: kad disks, kurā atrodas transakciju žurnāls, piepildās, PostgreSQL apstājas, lai aizsargātu savus datus. Sekojiet diska noslogojumam un paplašiniet to, pirms tas sasniedz 80 %.

Veiktspējas ziņā katra transakcijas apstiprināšana gaida, kamēr žurnāls tiek ierakstīts diskā: krātuves latentums nosaka rakstīšanas caurlaidspēju. Tieši šeit NVMe SSD rada atšķirību, daudz vairāk nekā lasīšanā, ko jau apkalpo atmiņa.

Procesors: viens vaicājums, viens kodols

PostgreSQL vaicājums izpildās vienā kodolā, izņemot lielas nolasīšanas, ko dzinējs paralelizē. Tāpēc vCPU skaits nosaka, cik smagu vaicājumu tiek apstrādāts vienlaikus: 2 vCPU pietiek biznesa lietojumprogrammai palaišanas brīdī, 4 līdz 8 der ļoti noslogotām datubāzēm un smagām atskaitēm.

Pirms pievienojat vCPU, atrodiet vaicājumus, kas tos patērē. Paplašinājums pg_stat_statements sakārto tos pēc kopējā izpildes laika:

postgresql.conf, pēc tam restartēšana
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Tajā pašā serverī, kur lietojumprogramma, vai atsevišķā?

Palaišanas brīdī datubāze tajā pašā serverī, kur lietojumprogramma, ir pareizā izvēle: starp tām nav tīkla latentuma, savienojums notiek caur Unix ligzdu, jādublē un jāuzrauga tikai viens serveris. Tās atdala, kad abas sāk sacensties par resursiem: kompilēšana vai datplūsmas maksimums iztukšo datubāzes kešatmiņu, datubāzei vajag visu atmiņu saviem datiem, vai rezerves kopēšanas prasības atšķiras.

Drošība un rezerves kopijas

Terminālis: saspiests eksports, pēc tam atjaunošana testa datubāzē
pg_dump -Fc -d mana_datubaze -f mana_datubaze-$(date +%F).dump
createdb mana_datubaze_test
pg_restore -d mana_datubaze_test mana_datubaze-2026-10-29.dump

Ātra PostgreSQL datubāze pareizajā serverī

VPS Pro darbojas uz Intel Xeon procesoriem, ECC atmiņas, kas reāllaikā izlabo kļūdas, un spoguļotiem NVMe SSD; katrs datu bloks tiek pārbaudīts ar kontrolsummu, un šifrēta rezerves kopija katru nakti tiek glabāta ārpus mašīnas. Visaptverošais atbalsts ir iekļauts: kad jūsu datubāze palēninās, mēs analizējam lēnos vaicājumus un indeksus, tad norādām iestatījumus, kas atdod jūsu lietojumprogrammai ātrumu.

Skatīt VPS Pro

Biežāk uzdotie jautājumi

Cik RAM vajag PostgreSQL?

Pietiekami, lai bieži lasītie dati ietilptu atmiņā. Biznesa lietojumprogrammai palaišanas brīdī pietiek ar 4 GB, ieskaitot datubāzi un lietojumprogrammu. Pēc tam sekojiet kešatmiņas trāpījumu īpatsvaram: kamēr tas paliek virs 99 %, atmiņas pietiek.

Kādu vērtību iestatīt shared_buffers?

25 % no atmiņas serverī, kas veltīts datubāzei, kā iesaka PostgreSQL dokumentācija: 1 GB no 4 GB, 2 GB no 8 GB, 4 GB no 16 GB. Virs 40 % ieguvums kļūst rets, jo pārējo paveic sistēmas kešatmiņa.

Cik PostgreSQL savienojumu var pieņemt VPS?

PostgreSQL pēc noklusējuma pieņem 100, un katrs savienojums ir process, kas patērē atmiņu. Tā vietā, lai paaugstinātu šos griestus, novietojiet datubāzes priekšā savienojumu apvienotāju, piemēram, PgBouncer: tad daži desmiti reālu savienojumu apkalpo simtiem lietojumprogrammas savienojumu.

Vai datubāze un lietojumprogramma jānodala?

Palaišanas brīdī tas nav vajadzīgs: tajā pašā serverī datubāze atbild bez tīkla latentuma, un visu var dublēt kopā. Tās atdala, kad viena traucē otrai, piemēram, kad kompilēšana vai datplūsmas maksimums iztukšo datubāzes kešatmiņu.

Sazinieties ar mums