Архитектура PostgreSQL: процессы, страницы, WAL, shared buffers

↑ 2.1 PostgreSQL: индексы, транзакции, оптимизация · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Понимание внутренностей помогает диагностировать проблемы производительности и надёжности.

Процессная модель

PostgreSQL создаёт отдельный процесс на каждое соединение (не поток). Поэтому соединения дороги (порядка 5–10 МБ на каждое) и нужен пул.

ПроцессРоль
postmasterпринимает соединения, порождает процессы
backendобслуживает одно клиентское соединение
checkpointerсбрасывает грязные страницы на диск при контрольных точках
background writerплавно записывает грязные страницы
WAL writerсбрасывает WAL-буфер
autovacuum launcher/workersочистка мёртвых версий строк, статистика
walsender / walreceiverрепликация
archiverархивация WAL

Хранение на диске

  • каждая таблица и индекс — файлы в каталоге данных (base/<oid>/<relfilenode>), сегменты по 1 ГБ;
  • данные хранятся в страницах (pages) по 8 КБ; в странице — заголовок, массив указателей, кортежи (tuples);
  • адрес строки — ctid (номер страницы, номер элемента);
  • большие значения выносятся в TOAST (сжатие и хранение вне строки при > ~2 КБ);
  • карта видимости (VM) и карта свободного места (FSM) — служебные слои.

Память

ОбластьПараметрРекомендации
Общий кэш страницshared_buffersоколо 25% ОЗУ как отправная точка
Память на операцию (сортировки, хэш)work_memумножается на число операций и соединений, осторожно
Обслуживаниеmaintenance_work_memдля VACUUM, CREATE INDEX
Подсказка планировщикуeffective_cache_size≈ 50–75% ОЗУ (включая кэш ОС)

PostgreSQL опирается также на кэш ОС (двойное кэширование).

WAL (Write-Ahead Log)

Правило: сначала записать изменение в журнал, потом в файлы данных.

  1. Изменение вносится в страницу в shared_buffers (страница становится «грязной»).
  2. Запись описания изменения в WAL, при COMMIT — fsync WAL на диск.
  3. Страницы данных записываются позже (bgwriter, checkpointer).
  4. При аварии — redo: проигрывание WAL от последней контрольной точки.

Что даёт WAL: долговечность (Durability), быстрое подтверждение (последовательная запись), репликацию (передача WAL), PITR (восстановление на момент времени), логическую репликацию.

Параметры: wal_level (replica / logical), synchronous_commit, max_wal_size, checkpoint_timeout, full_page_writes.

Контрольная точка (checkpoint)

Сброс всех грязных страниц на диск и фиксация позиции в WAL. Слишком частые — всплески I/O, слишком редкие — долгое восстановление. Мониторинг: pg_stat_bgwriter / pg_stat_checkpointer.

Жизненный цикл запроса

  1. Parser: разбор SQL → дерево.
  2. Analyzer/Rewriter: проверка объектов, применение правил (представления).
  3. Planner/Optimizer: выбор плана по статистике (pg_statistic, ANALYZE).
  4. Executor: выполнение узлов плана.

Полезные представления

pg_stat_activity, pg_stat_database, pg_stat_user_tables, pg_locks, pg_stat_statements, pg_stat_wal.

Вопросы с ответами