autovacuum

Тема дорожной карты · PostgreSQL

Autovacuum — встроенный фоновый процесс обслуживания PostgreSQL, который автоматически возвращает дисковое пространство, занятое «мёртвыми» версиями строк, появляющимися в результате операций UPDATE и DELETE в рамках архитектуры многоверсионного управления параллельным доступом (MVCC). Без регулярной работы autovacuum накапливается раздувание таблиц и возникает угроза переполнения идентификаторов транзакций — жёсткого ограничения примерно в 2 миллиарда транзакций, при достижении которого реляционная база данных полностью откажется принимать новые записи. Демон autovacuum управляется несколькими ключевыми параметрами конфигурации: autovacuum_vacuum_scale_factor, autovacuum_analyze_scale_factor, autovacuum_vacuum_cost_delay и autovacuum_max_workers — все они настраиваются в postgresql.conf для балансировки пропускной способности обслуживания и производительности оптимизации запросов на нагруженных таблицах. Мониторинг pg_stat_user_tables на предмет значений n_dead_tup и временных меток last_autovacuum является стандартной практикой эксплуатации PostgreSQL для проверки того, что autovacuum справляется с интенсивностью записи.

Как это работает

autovacuum — цена MVCC. UPDATE и DELETE не удаляют строки — помечают dead; VACUUM возвращает место, ANALYZE обновляет статистику планировщика, REINDEX перестраивает раздутые индексы. autovacuum работает непрерывно по дефолту, но его триггеры консервативны для больших таблиц — тюньте autovacuum_vacuum_scale_factor, autovacuum_analyze_scale_factor per-table. VACUUM FULL переписывает таблицу (лочит записи!); pg_repack делает online. Смотрите pg_stat_user_tables.n_dead_tup для bloat.

Когда применять

Тюньте autovacuum агрессивно на горячих таблицах (например autovacuum_vacuum_scale_factor = 0.01 для миллион-строчных). Мониторьте bloat через pgstattuple или pgstatindex из pg_repack. pg_repack еженедельно на самых больших таблицах. Всегда ANALYZE после большой загрузки/миграции — старая статистика даёт плохие планы. Никогда VACUUM FULL под трафиком — лочит всю таблицу.

Типичные ошибки

Ловушки autovacuum: игнор autovacuum до 100GB таблицы с 50GB dead-строк; transaction wraparound — миф 200-летней давности, реальный (SELECT datname, age(datfrozenxid) FROM pg_database); неконтролируемый index bloat (запросы медленнее со временем при том же row count); VACUUM FULL в пик (CEO позвонит). Мониторьте + alerts на bloat-метрики с первого дня.

Связанные понятия

Полезные ресурсы