PostgreSQL
- title
- PostgreSQL
- type
- entity
- summary
- Реляционная СУБД с открытым кодом; модель процесса на соединение и общий buffer pool, фигурирует в ряде разборов взаимодействия с ядром
- tags
- database, postgresql
- sources
- linux-broke-postgresql
- created
- 2026-04-30
- updated
- 2026-07-29
- lang
- ru
- translation_of
- postgresql
- source_updated
- 2026-07-29
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
PostgreSQL - реляционная СУБД с открытым исходным кодом, работающая по модели "процесс на соединение": когда клиент подключается, сервер через fork запускает отдельный backend для его обслуживания. Backend'ы совместно используют большой кэш в оперативной памяти - shared buffer pool, размер которого задаётся параметром shared_buffers. В пуле хранятся недавно прочитанные 8-килобайтные страницы данных (единица хранения PostgreSQL на диске, в отличие от страниц памяти Linux), что позволяет повторным чтениям обходиться без диска.
Когда backend'у нужна страница данных, отсутствующая в buffer pool'е, он вызывает StrategyGetBuffer, чтобы выбрать слот - свободный или кандидата на вытеснение. Этот выбор защищает единый глобальный spinlock. Архитектура рассчитана на то, что критическая секция занимает десятки наносекунд, и удерживающий её процесс освобождает блокировку раньше, чем кто-либо успеет это заметить.
Заметные разборы в wiki
- linux-7-postgres-regression - в Linux 7.0 убрали
PREEMPT_NONE(см. linux-preemption-models), позволив планировщику вытеснять backend прямо посреди page fault'а, пока тот держит spinlock функцииStrategyGetBuffer. На 96-vCPU Graviton4 со 120 ГБshared_buffersи 4-килобайтными страницами все остальные backend'ы крутятся в ожидании занятого lock'а; пропускная способность падает вдвое. Обходное решение: включить huge-pages. - postgres-listen-notify-scaling - фиксация транзакции с вызовом NOTIFY захватывает глобальную эксклюзивную блокировку и удерживает её до завершения
fsync()этого commit'а. Пишущие операции с уведомлениями сериализуются и лишаются group commit'а, что ограничивает пропускную способность потолком в 2.9 тыс./сек без упора в ресурсы; батчинг уведомлений вне горячего пути поднимает её до 60 тыс./сек. - linux-kernel-pgit - pgit загружает git-историю ядра Linux в PostgreSQL, делая её доступной для SQL-запросов. Другой ракурс на ту же базу данных.
- pgsimcity - движок, визуализированный в виде 3D-города: shared buffer pool, clock sweep, WAL, checkpointer и autovacuum становятся районами, по которым можно ходить и ломать их.