PostgreSQL на VPS: как да оразмерите паметта и диска

Бързата PostgreSQL база е база, чиито често четени данни се побират в паметта. Цялото оразмеряване започва оттук: обемът на базата, делът, който наистина работи, броят на връзките, след това дискът и неговият резерв. Това ръководство дава метода, началните настройки за 4, 8 и 16 GB памет и заявките, които измерват съществуваща база.

Публикувано на 29 октомври 2026 г. Автор: Време за четене: 10 минути

Всички ръководства

Накратко

  1. Измерете обема на базата и на индексите ѝ, след това дела, който се чете често: именно той трябва да се побере в паметта.
  2. Отправна точка: shared_buffers на 25 % от паметта, effective_cache_size на 75 %, random_page_cost = 1.1 на NVMe SSD.
  3. Всяка връзка е процес: над няколко десетки активни връзки поставете PgBouncer пред базата.
  4. Диск: данните и индексите след една година, плюс поне 30 % резерв. Пълният диск спира PostgreSQL.
  5. Делът на четенията от кеша трябва да остава над 99 %: под тази стойност базата няма достатъчно памет.
  6. Правете резервно копие всеки ден с pg_dump, извън сървъра, и възстановявайте редовно, за да го проверите.

Започнете от полезния обем

Паметта на един сървър за бази данни служи преди всичко за кеш: страница, прочетена от паметта, се обслужва много по-бързо от страница, прочетена от диска, дори NVMe. Затова въпросът не е само „колко тежи базата?“, а „каква част от нея се чете често?“. База от 50 GB, в която се търсят само последните дванадесет месеца, може би работи с 8 GB.

За съществуваща база две заявки дават общия обем и най-големите таблици, с индексите им:

SQL (psql)
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 GB8 GB16 GBРоля
shared_buffers1 GB2 GB4 GBСобственият кеш на PostgreSQL
effective_cache_size3 GB6 GB12 GBОчакваният общ кеш, който насочва избора на планове за заявките
work_mem8 MB16 MB32 MBПаметта за всяко сортиране или хеширане, на връзка: умножете по едновременните заявки
maintenance_work_mem256 MB512 MB1 GBСъздаването на индекси и VACUUM
random_page_cost1.11.11.1Оценената стойност на едно произволно четене: 4 по подразбиране, много над реалната стойност на NVMe SSD

Тези стойности предполагат база, която е сама на сървъра. Ако приложението работи до нея, извадете първо неговата памет (процеси, кеш, компилиране) и приложете процентите към остатъка: сървър с 8 GB, на който работи приложение с 3 GB, се настройва като база с 5 GB.

postgresql.conf, за сървър с 8 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 %:

SQL (psql)
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 сървър носи повече от таблиците:

Правилото: обемът след една година, плюс поне 30 % резерв. Това не е въпрос на удобство: когато дискът, на който е журналът на транзакциите, се запълни, PostgreSQL спира, за да защити данните си. Следете заетостта и разширявайте преди 80 %.

Що се отнася до производителността, всяко потвърждаване на транзакция чака записа на журнала на диска: латентността на хранилището определя скоростта на запис. Именно тук NVMe SSD прави разликата, много повече, отколкото при четенията, които паметта вече обслужва.

Процесорът: една заявка, едно ядро

Една PostgreSQL заявка се изпълнява на едно ядро, с изключение на големите четения, които двигателят паралелизира. Затова броят на vCPU определя броя на тежките заявки, обработвани едновременно: 2 vCPU стигат на бизнес приложение при старта, 4 до 8 са подходящи за силно натоварени бази и тежки отчети.

Преди да добавите vCPU, намерете заявките, които ги консумират. Разширението pg_stat_statements ги подрежда по общо време:

postgresql.conf, след това рестартиране
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
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 сокет, един сървър за архивиране и наблюдение. Разделят се, когато двете си оспорват ресурсите: компилиране или пик на трафика, които изпразват кеша на базата, база, която се нуждае от цялата памет за данните си, или различни изисквания за резервните копия.

Сигурност и резервни копия

Терминал: компресиран експорт, след това възстановяване в тестова база
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

Бърза PostgreSQL база на правилния сървър

VPS Pro работи на процесори Intel Xeon, ECC памет, която коригира грешките в движение, и NVMe SSD в огледален режим, като всеки блок данни се проверява с контролна сума, а криптирано резервно копие се прави всяка нощ, извън машината. Цялостната поддръжка е включена: когато базата ви се забави, анализираме бавните заявки и индексите, след което ви посочваме настройките, които връщат скоростта на приложението ви.

Разгледайте VPS Pro

Често задавани въпроси

Колко RAM е нужна за PostgreSQL?

Достатъчно, за да се побират в паметта често четените данни. За бизнес приложение при старта 4 GB стигат за базата и приложението заедно. След това измервайте дела на четенията от кеша: докато той остава над 99 %, паметта е достатъчна.

Каква стойност да зададете за shared_buffers?

25 % от паметта на сървър, посветен на базата, както препоръчва документацията на PostgreSQL: 1 GB при 4 GB, 2 GB при 8 GB, 4 GB при 16 GB. Над 40 % ползата рядко нараства, тъй като кешът на системата върши останалото.

Колко PostgreSQL връзки може да приеме един VPS?

PostgreSQL приема 100 по подразбиране и всяка връзка е процес, който консумира памет. Вместо да вдигате този таван, поставете пред базата инструмент за споделяне на връзки като PgBouncer: тогава няколко десетки реални връзки обслужват стотици връзки на приложението.

Трябва ли базата данни и приложението да са на отделни сървъри?

Не при старта: на същия сървър базата отговаря без мрежова латентност и всичко се архивира наведнъж. Разделят се, когато едното пречи на другото, например когато компилиране или пик на трафика изпразват кеша на базата.

Свържете се с нас