Бързата PostgreSQL база е база, чиито често четени данни се побират в паметта. Цялото оразмеряване започва оттук: обемът на базата, делът, който наистина работи, броят на връзките, след това дискът и неговият резерв. Това ръководство дава метода, началните настройки за 4, 8 и 16 GB памет и заявките, които измерват съществуваща база.
shared_buffers на 25 % от паметта, effective_cache_size на 75 %, random_page_cost = 1.1 на NVMe SSD.pg_dump, извън сървъра, и възстановявайте редовно, за да го проверите.Паметта на един сървър за бази данни служи преди всичко за кеш: страница, прочетена от паметта, се обслужва много по-бързо от страница, прочетена от диска, дори NVMe. Затова въпросът не е само „колко тежи базата?“, а „каква част от нея се чете често?“. База от 50 GB, в която се търсят само последните дванадесет месеца, може би работи с 8 GB.
За съществуваща база две заявки дават общия обем и най-големите таблици, с индексите им:
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT relname AS tablitsa,
pg_size_pretty(pg_total_relation_size(relid)) AS razmer_s_indeksi
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
За бъдеща база направете оценка таблица по таблица: очакван брой редове след една година × среден размер на един ред, след това добавете индексите, които обикновено тежат от 30 до 100 % от данните. Пример: 2 милиона реда на месец, по 500 байта всеки, правят 12 GB данни след една година и 18 до 24 GB с индексите.
PostgreSQL пази прочетените страници на две нива: собствения си кеш (shared_buffers) и файловия кеш на системата. Документацията му препоръчва да се започне от 25 % от паметта за shared_buffers на посветен сървър и отбелязва, че над 40 % ползата рядко нараства: останалото е от полза за кеша на системата и за сортиранията.
| Параметър | 4 GB | 8 GB | 16 GB | Роля |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | Собственият кеш на PostgreSQL |
effective_cache_size | 3 GB | 6 GB | 12 GB | Очакваният общ кеш, който насочва избора на планове за заявките |
work_mem | 8 MB | 16 MB | 32 MB | Паметта за всяко сортиране или хеширане, на връзка: умножете по едновременните заявки |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Създаването на индекси и VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Оценената стойност на едно произволно четене: 4 по подразбиране, много над реалната стойност на NVMe SSD |
Тези стойности предполагат база, която е сама на сървъра. Ако приложението работи до нея, извадете първо неговата памет (процеси, кеш, компилиране) и приложете процентите към остатъка: сървър с 8 GB, на който работи приложение с 3 GB, се настройва като база с 5 GB.
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1
shared_buffers влиза в сила едва след рестартиране на PostgreSQL; останалите параметри се презареждат без прекъсване с SELECT pg_reload_conf();.
За да разберете дали паметта стига, прочетете дела на четенията от кеша. При бизнес приложение или сайт той надхвърля 99 %:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS dyal_ot_kesha
FROM pg_stat_database
WHERE datname = current_database();
PostgreSQL отваря по един процес на връзка и приема 100 по подразбиране (max_connections). Всеки процес заема няколко мегабайта в покой, повече, когато сортира или хешира данни (work_mem, понякога по няколко пъти в една и съща заявка). Да вдигнете max_connections на 500, за да следвате едно „бъбриво“ приложение, означава да изложите сървъра на риск да остане без памет при първия пик.
Правилният отговор е инструмент за споделяне на връзки (connection pooler): PgBouncer в режим transaction кара стотици връзки на приложението да делят няколко десетки реални връзки. Фреймуърците също имат собствен пул (SQLAlchemy, Prisma, HikariCP): настройте размера му според броя vCPU на сървъра на базата, а не според броя на потребителите.
Дискът на един PostgreSQL сървър носи повече от таблиците:
max_wal_size), повече при масов импорт и още повече, ако архивирането на журнала изостава.work_mem.VACUUM FULL и повторното изграждане на индекс записват пълно копие, преди да освободят старото.Правилото: обемът след една година, плюс поне 30 % резерв. Това не е въпрос на удобство: когато дискът, на който е журналът на транзакциите, се запълни, PostgreSQL спира, за да защити данните си. Следете заетостта и разширявайте преди 80 %.
Що се отнася до производителността, всяко потвърждаване на транзакция чака записа на журнала на диска: латентността на хранилището определя скоростта на запис. Именно тук NVMe SSD прави разликата, много повече, отколкото при четенията, които паметта вече обслужва.
Една PostgreSQL заявка се изпълнява на едно ядро, с изключение на големите четения, които двигателят паралелизира. Затова броят на vCPU определя броя на тежките заявки, обработвани едновременно: 2 vCPU стигат на бизнес приложение при старта, 4 до 8 са подходящи за силно натоварени бази и тежки отчети.
Преди да добавите vCPU, намерете заявките, които ги консумират. Разширението pg_stat_statements ги подрежда по общо време:
shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT calls, round(total_exec_time) AS ms_obshto,
round(mean_exec_time::numeric, 1) AS ms_sredno, query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
При старта базата на същия сървър като приложението е правилният избор: никаква мрежова латентност между двете, връзка през Unix сокет, един сървър за архивиране и наблюдение. Разделят се, когато двете си оспорват ресурсите: компилиране или пик на трафика, които изпразват кеша на базата, база, която се нуждае от цялата памет за данните си, или различни изисквания за резервните копия.
listen_addresses = 'localhost', докато само приложението на сървъра се свързва с базата. Ако друг сървър трябва да има достъп, отворете порт 5432 само за неговия адрес, в защитната стена и в pg_hba.conf.scram-sha-256 в pg_hba.conf, по една роля на приложение, без права на суперпотребител.pg_dump, копирано извън сървъра.pg_dump -Fc -d moyata_baza -f moyata_baza-$(date +%F).dump
createdb moyata_baza_test
pg_restore -d moyata_baza_test moyata_baza-2026-10-29.dump
VPS Pro работи на процесори Intel Xeon, ECC памет, която коригира грешките в движение, и NVMe SSD в огледален режим, като всеки блок данни се проверява с контролна сума, а криптирано резервно копие се прави всяка нощ, извън машината. Цялостната поддръжка е включена: когато базата ви се забави, анализираме бавните заявки и индексите, след което ви посочваме настройките, които връщат скоростта на приложението ви.
Достатъчно, за да се побират в паметта често четените данни. За бизнес приложение при старта 4 GB стигат за базата и приложението заедно. След това измервайте дела на четенията от кеша: докато той остава над 99 %, паметта е достатъчна.
25 % от паметта на сървър, посветен на базата, както препоръчва документацията на PostgreSQL: 1 GB при 4 GB, 2 GB при 8 GB, 4 GB при 16 GB. Над 40 % ползата рядко нараства, тъй като кешът на системата върши останалото.
PostgreSQL приема 100 по подразбиране и всяка връзка е процес, който консумира памет. Вместо да вдигате този таван, поставете пред базата инструмент за споделяне на връзки като PgBouncer: тогава няколко десетки реални връзки обслужват стотици връзки на приложението.
Не при старта: на същия сървър базата отговаря без мрежова латентност и всичко се архивира наведнъж. Разделят се, когато едното пречи на другото, например когато компилиране или пик на трафика изпразват кеша на базата.
Simafri
Да поговорим за Вашия проект
Кажете ни с няколко думи от какво имате нужда: отговаряме Ви бързо.
Благодарим! Вашето запитване е изпратено. Ще се свържем с вас скоро.
Предпочитате имейл? Пишете ни на support@simafri.com.