Ā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.
shared_buffers 25 % no atmiņas, effective_cache_size 75 %, random_page_cost = 1.1 uz NVMe SSD.pg_dump, ārpus servera, un regulāri to atjaunojiet, lai pārbaudītu.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:
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.
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.
| Parametrs | 4 GB | 8 GB | 16 GB | Loma |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | PostgreSQL pašas kešatmiņa |
effective_cache_size | 3 GB | 6 GB | 12 GB | Aplēstā kopējā kešatmiņa, kas ietekmē vaicājumu plānu izvēli |
work_mem | 8 MB | 16 MB | 32 MB | Atmiņa katrai kārtošanas vai heša operācijai, uz savienojumu: jāreizina ar vienlaicīgo vaicājumu skaitu |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Indeksu izveide un VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Nejauš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.
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 %:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS kesatminas_trapijumi
FROM pg_stat_database
WHERE datname = current_database();
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.
PostgreSQL servera diskā glabājas vairāk nekā tabulas:
max_wal_size), vairāk masveida importa laikā un vēl vairāk, ja žurnāla arhivēšana atpaliek.work_mem.VACUUM FULL un indeksa pārbūve ieraksta pilnu kopiju, pirms atbrīvo veco.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.
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:
shared_preload_libraries = 'pg_stat_statements'
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;
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.
listen_addresses = 'localhost', kamēr pieslēdzas tikai servera lietojumprogramma. Ja piekļuve vajadzīga citam serverim, atveriet portu 5432 tikai tā adresei, ugunsmūrī un failā pg_hba.conf.scram-sha-256 failā pg_hba.conf, katrai lietojumprogrammai sava loma, bez superlietotāja tiesībām.pg_dump, nokopēta ārpus servera.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
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.
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.
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.
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.
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.
Simafri
Parunāsim par jūsu ieceri
Pasakiet mums dažos vārdos, kas jums vajadzīgs: mēs jums ātri atbildam.
Paldies! Jūsu pieprasījums ir nosūtīts. Drīzumā ar jums sazināsimies.
Labāk e-pastu? Rakstiet mums uz support@simafri.com.