PostgreSQL в виде 3D-города: PGSimCity наглядно объясняет WAL, autovacuum и storage

PostgreSQL крутится под капотом у половины нашего самохостинга — Immich, Nextcloud, Paperless, Gitea, куча панелей и ботов хранят данные именно в нём. Но что реально происходит внутри, когда вы делаете INSERT, знают немногие. Проект PGSimCity, две недели продержавшийся в топе Hacker News (~930 очков), объясняет внутренности PostgreSQL нестандартно — как интерактивный 3D-город, по которому можно погулять. Отличный повод разобраться, что там на самом деле происходит.

Что это

PGSimCity — независимая некоммерческая образовательная визуализация внутреннего устройства PostgreSQL (моделируется версия 18.4). Вместо стены документации вам показывают трёхмерный город (нужен браузер с WebGL2), где разные «районы» — это подсистемы СУБД:

  • WAL (Write-Ahead Log) — журнал упреждающей записи;
  • storage — как данные лежат на диске;
  • standbys / recovery / continuity — реплики, восстановление, отказоустойчивость;
  • maintenance — обслуживание (autovacuum и прочее).

Отдельная фишка — «Machine room», где рядом с моделью работает настоящий PostgreSQL, чтобы можно было сопоставить абстракцию с реальным поведением.

Почему стоит понимать эти внутренности

Это не праздное любопытство — три вещи из «города» напрямую бьют по вашему self-hosted сервису:

  • WAL. Каждое изменение сначала пишется в журнал, и только потом — в основные файлы. Отсюда растут две практические темы: как настроена запись WAL, тем самым определяется устойчивость к сбою питания; а сам WAL — основа репликации и point-in-time recovery. Если вы делаете бэкапы Immich/Nextcloud «на живую» без понимания WAL — вы рискуете получить неконсистентный дамп.
  • Autovacuum. PostgreSQL из-за MVCC не удаляет старые версии строк сразу — их подчищает autovacuum. Забили на него — получаете «раздувание» (bloat), распухшую базу и тормоза. Классические грабли на долгоживущих self-hosted инсталляциях.
  • Checkpoints и storage. Понимание, когда грязные страницы сбрасываются на диск, объясняет периодические всплески I/O, из-за которых «тормозит Nextcloud» на слабом NAS.

Трезвая оценка

Расставим ожидания честно.

  • Это ранний прототип. Авторы прямо помечают проект как «early, reviewed prototype» и приглашают присылать исправления модели и объяснений. То есть это обучающая иллюстрация, а не истина в последней инстанции и не замена документации.
  • Модель ≠ реальность. 3D-город — это метафора; детали упрощены. Для продакшн-тюнинга всё равно нужны официальная документация PostgreSQL, EXPLAIN, pg_stat_* и здравый смысл.
  • Нужен WebGL2. На слабой машине или в аскетичном браузере 3D может тормозить — это интерактивная визуализация, а не текст.
  • Практических «сделай так» из неё вы не вынесете — это про понимание модели, а конкретные команды берите из доков.

Что делать

  1. Погуляйте по «городу» и сопоставьте районы с тем, что крутится у вас: WAL ↔ ваши бэкапы, maintenance ↔ autovacuum, storage ↔ диск на сервере.
  2. Проверьте autovacuum на своих инсталляциях: SELECT relname, n_dead_tup FROM pg_stat_user_tables ORDER BY n_dead_tup DESC; — если мёртвых строк много, пора разбираться с настройками.
  3. Пересмотрите стратегию бэкапов с учётом WAL: для боевых баз — pg_dump на консистентном снапшоте или физический бэкап + архив WAL, а не копирование файлов «на живую».
  4. Используйте как онбординг — это отличный способ объяснить джуну или себе, что такое WAL и vacuum, за 20 минут вместо главы мануала.

Источники

А вы копались во внутренностях своей СУБД или она для вас «чёрный ящик, который просто работает»? Ловили bloat или тормоза из-за autovacuum на self-hosted сервисах — как чинили?