Найти в Дзене
Postgres DBA

Аномально долгая работа autovacuum при высокой нагрузке

Что происходит , если при выполнении фазы SCAN_HEAP в процессе autovacuum интенсивно появляются новые строки при высокой нагрузке UPDATE для СУБД PostgreSQL ? При выполнении фазы SCAN_HEAP в процессе autovacuum в PostgreSQL под высокой нагрузкой UPDATE с интенсивным появлением новых строк могут возникать следующие проблемы и особенности поведения: Оптимизация таблиц:
Оглавление
Инженер DBA нашел причину очень медленной работы autovacuum для СУБД PostgreSQL при высокой нагрузке.💫 Создано с помощью GigaChat
Инженер DBA нашел причину очень медленной работы autovacuum для СУБД PostgreSQL при высокой нагрузке.💫 Создано с помощью GigaChat

Начало

❗Проблема ℹ️По завершении нагрузочного тестирования n_dead_tuples на порядки превышает значение autovacuum_vacuum_threshold. ❓Возможно значение autovacuum_vacuum_cost_limit слишком велико и autovacuum_worker для таблицы работает постоянно , потому, что delay = 0. Текущее значение cost_limit = 5600. 🗓️Протестировать низкое значение cost_limit до 2000.(Возможно ниже)
Postgres DBA7 июля 2025

ℹ️Гипотеза о причинах роста мертвых строк dzen.ru/...ink при оптимизации параметров autovacuum: 1️⃣Изменение параметров приводит к росту производительности СУБД 2️⃣Рост производительности СУБД означает большее количество операций UPDATE в ходе нагрузочного тестирования ⚠️В результате: Мертвые строки накапливаются быстрее, чем autovacuum успевает очищать ⚠️Принципиальное ограничение…
Postgres DBA8 июля 2025

Вопрос

Что происходит , если при выполнении фазы SCAN_HEAP в процессе autovacuum интенсивно появляются новые строки при высокой нагрузке UPDATE для СУБД PostgreSQL ?

Ответ

При выполнении фазы SCAN_HEAP в процессе autovacuum в PostgreSQL под высокой нагрузкой UPDATE с интенсивным появлением новых строк могут возникать следующие проблемы и особенности поведения:

1. Увеличение времени выполнения autovacuum:

  • Причина: Фаза SCAN_HEAP требует полного сканирования таблицы для выявления "мертвых" кортежей (устаревших версий строк). Новые UPDATE создают дополнительные мертвые кортежи во время сканирования.
  • Последствие: Autovacuum вынужден обрабатывать больше данных, чем планировалось изначально. Это замедляет завершение фазы и увеличивает общее время очистки.

2. Накопление "мертвых" кортежей (Bloat):

  • Причина: Autovacuum фиксирует состояние таблицы на момент начала сканирования. Новые мертвые кортежи, появившиеся после прохода по блоку данных, не будут удалены в текущем цикле.
  • Последствие: Возникает "хвост" из неочищенных кортежей.

Как смягчить проблему?

Оптимизация таблиц:

  • Установите FILLFACTOR < 100 (например, 80), чтобы оставить место в блоках для новых версий строк.

Пример - длительность выполнения autovacuum при нагрузочном тестировании

Количество autiovacuum и нагузка в ходе нагрузочного тестирования.
Количество autiovacuum и нагузка в ходе нагрузочного тестирования.
Операция 26 - не завершена до докончания теста.
Операция 26 - не завершена до докончания теста.

Стартовая нагрузка - 5 соединений

Длительность операций autovacuum в ходе стартовой нагрузки
Длительность операций autovacuum в ходе стартовой нагрузки
Время выполнения autovauum - увеличивается даже при постоянной нагрузке.
Время выполнения autovauum - увеличивается даже при постоянной нагрузке.

Нагрузочное тестирование

Операция 26 - не завершена до окончания теста
Операция 26 - не завершена до окончания теста
Рост времени работы autovacuum в ходе нагрузочного тестирования
Рост времени работы autovacuum в ходе нагрузочного тестирования

Итог

  1. Для данной конфигурации СУБД и данного сценария синтетической нагрузки, работоспособность autovacuum после нагрузки 9 соединений полностью деградировала.
  2. autovacuum начатый во время нагрузочного тестирования(№26) продолжался более 8 часов.