По агрессивному автовакууму , предварительно , чудес не бывает - за повышение производительности при средней нагрузке придётся платить снижением производительности при нагрузке близкой к максимальной. Если autovacuum worker работает постоянно(а при высокой нагрузке иначе нет смысла), ресурсы CPU кончаются раньше . Обслуживание СУБД требует ресурсов . Но , конечно можно и не обслуживать , работает же. А +/- 5-10% изменения производительности СУБД современные приложения и не заметят.
После анализа результатов экспериментов , будут данные по ожиданиям . И в общем-то, тему можно закрывать , хотя с академической точки - интересно будет протестировать параметр autovacuum_cost_delay.
P.S. Так выглядит агрессивный автовакуум PostgreSQL - по мнению нейросети 🤪
По результатам нескольких независимых исследований было установлено количественное влияние изменения fillfactor на производительность PostgreSQL при массовых UPDATE операциях.
Для снижения fillfactor на 50% (с 100% до 50%): Основываясь на исследованиях, можно ожидать:
Улучшение производительности UPDATE на 50-70%
Увеличение потребления места на диске вдвое
Снижение производительности SELECT на 20-30% из-за большего количества страниц
Для данной СУБД , при использовании сценария смешанной нагрузки "Mix", уменьшение значения параметра fillfactor с 100 до 50 дает прирост производительности СУБД:
При нагрузке от 5 до 115 соединений : от -6 до 9%
При нормальной нагрузке(5-22 соединения): от 0 до 9%
For our benchmark, we created a table with 7 columns, three indexes, and 1,000,000 rows. We then updated 30% of the rows and measured the update performance across different fillfactor settings.
Синтетический тест самописным бенчмарком не используя pgbench. Тут анализировать нечего.
Чтобы избежать ситуации - "что-то с памятью моей стало".
Задача
Подготовить базовую формулу расчета для базовой настройки конфигурационных параметров управления памятью для обслуживания СУБД :
shared_buffers
Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти.
Если вы используете выделенный сервер с объёмом ОЗУ 1 ГБ и более, разумным начальным значением shared_buffers будет 25% от объёма памяти. Существуют варианты нагрузки, при которых эффективны будут и ещё большие значения shared_buffers, но так как Postgres Pro использует и кеш операционной системы, выделять для shared_buffers более 40% ОЗУ вряд ли будет полезно.
maintenance_work_mem
Задаёт максимальный объём памяти для операций обслуживания БД, в частности VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY.
autovacuum_work_mem
Задаёт максимальный объём памяти, который будет использовать каждый рабочий процесс автоочистки.
Немного тонкой настройки и СУБД будет работать как часы.
Вопрос нейросети:
Какой параметр для настройки автовакуума для СУБД PostgreSQL эффективнее использовать для очень больших таблиц : autovacuum_vacuum_scale_factor или autovacuum_vacuum_threshold ?
Ответ DeepSeek:
Для очень больших таблиц в PostgreSQL эффективнее использовать параметр autovacuum_vacuum_threshold, а не autovacuum_vacuum_scale_factor. Вот обоснование:
Проблема autovacuum_vacuum_scale_factor для больших таблиц:
Масштабируемость: Формула запуска автовакуума: autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * table_size. По умолчанию: threshold = 50, scale_factor = 0.2 (20%). Для таблицы на 1 млрд строк порог срабатывания: 50 + 0.2 * 1 000 000 000 = 200 000 050 мертвых кортежей. Это приводит к редким запускам и накоплению огромного числа мертвых кортежей.
Риски: Замедление запросов: Длинные таблицы (из-за мертвых кортежей) снижают производительность. Блокировки: Очистка большого объема данных блокирует операции. Срыв транзакций: Если autovacuum не успевает очищать данные до заполнения autovacuum_freeze_max_age.
Почему autovacuum_vacuum_threshold эффективнее?
Фиксированный порог: Позволяет задать абсолютное число мертвых кортежей для запуска (независимо от размера таблицы). Пример: ALTER TABLE big_table SET (autovacuum_vacuum_threshold = 1000000); Автовакуум запустится при достижении 1 млн мертвых кортежей, даже если таблица содержит 1 млрд строк.
Гранулярность: Настройка применяется индивидуально к большим таблицам без влияния на маленькие. Оптимальные значения: от 100 000 до 10 000 000 (зависит от нагрузки и размера).
Рекомендуемая стратегия:
1. Уменьшить scale_factor:
ALTER TABLE big_table SET (autovacuum_vacuum_scale_factor = 0.01); -- 1%
Для таблицы на 1 млрд строк порог: 50 + 0.01 * 1e9 = 10 000 050.
2. Увеличить threshold:
ALTER TABLE big_table SET (autovacuum_vacuum_threshold = 1000000);
Порог: 1 000 000 (фиксированный, без умножения на размер).
3.Комбинировать параметры:
ALTER TABLE big_table SET (autovacuum_vacuum_scale_factor = 0.005, -- 0.5%autovacuum_vacuum_threshold = 500000);
Формула: 500 000 + 0.005 * N.
Дополнительные настройки:
autovacuum_vacuum_cost_limit (увеличить для ускорения):
ALTER TABLE big_table SET (autovacuum_vacuum_cost_limit = 2000); -- вместо 200 по умолчанию
autovacuum_naptime (уменьшить интервал проверок).
Итог:
Для очень больших таблиц:
Основной параметр: autovacuum_vacuum_threshold (фиксированный порог).
Вспомогательный: autovacuum_vacuum_scale_factor (уменьшать до 0.1–0.5%).
Настраивать индивидуально для таблицы через ALTER TABLE.
Мониторить эффективность через представление pg_stat_user_tables (столбцы n_dead_tup и last_autovacuum).
До финиша, сложно предсказать результат. Нужны тесты.
Задача
Провести тестирование методологии для оценки влияния оптимизации конфигурационных параметров СУБД на производительность СУБД.
Общий алгоритм действий и постановка эксперимента
Тестовый прогон нагрузочного тестирования по сценарию смешанной нагрузки с целью определения базовых показателей производительности, характерных ожиданий и нагрузки на СУБД соответствующей максимальной производительности (N_BASE) .
Изменение значений конфигурационных параметров. Нагрузочное тестирование с минимальной нагрузки до нагрузки N_BASE.
Сравнительный анализ изменения производительности и характерных ожиданий СУБД.
Конфигурация виртуальной машины
CPU = 2
RAM = 1GB
Postgres Pro (enterprise certified) 15
Размер тестовой БД = 10GB
Эксперимент-1 : Тестовый прогон при базовых значениях конфигурационных параметров
Какие типы ожидания wait_event_type будут иметь наибольшую корреляцию со снижением производительности СУБД PostgreSQL при выполнении UPDATE для виртуальной машины CPU = 2 и RAM = 2GB при росте нагрузки с 5 до 115 одновременных соединений ?
Ответ нейросети
При анализе корреляции между типами ожиданий (wait_event_type) в PostgreSQL и снижением производительности во время UPDATE на слабой ВМ (2 vCPU, 2 ГБ RAM) при росте нагрузки с 5 до 115 соединений, наибольшую корреляцию будут иметь следующие типы ожиданий, ранжированные по степени влияния:
1. LWLock (Lightweight Locks)
Почему корреляция высокая:
На слабых ВМ (особенно с 2 vCPU) нехватка CPU усиливает конкуренцию за системные ресурсы.
LWLock защищает внутренние структуры данных (буферы, память, lock-менеджер). При высокой нагрузке (115 соединений) процессы блокируются в очередях на эти ресурсы.
Подтипы buffer_content, buffer_mapping, lock_manager будут доминировать из-за частого доступа к буферам и блокировкам.
Связь с производительностью: Прямая корреляция с ростом времени ожидания и снижением TPS (transactions per second).
2. Lock (Транзакционные блокировки)
Почему корреляция высокая:
UPDATE вызывает эксклюзивные блокировки строк (ROW SHARE/EXCLUSIVE).
При 115 соединениях конкуренция за одни строки/таблицы резко возрастает → частые ожидания снятия блокировок.
Возникает при ожидании доступа к буферу данных, удерживаемому другим процессом.
Усиливается при нехватке RAM и высокой конкуренции за буферы.
Менее критичен, чем LWLock/Lock, но значим при массовых UPDATE.
Итог: Наибольший вклад в снижение производительности внесут LWLock и Lock из-за нехватки CPU/RAM и высокой конкуренции. IO станет критичным при исчерпании буферного кеша.
Как обстоит ситуация в реальности :
Результаты
Для данного сценария "Update only"и данной конфигурации СУБД характерными значениями корреляции между ожиданиями СУБД и типами ожиданий , являются :
IO : сильная отрицательная корреляция , влияние ожиданий типа IO на производительность СУБД отсутствует.
IPC : ожидания практически отсутствуют, влияние на производительность СУБД отсутствует.
Lock : очень сильная прямая корреляция, сильное влияние ожиданий типа Lock на снижение производительности СУБД .
LWLock : слабая отрицательная корреляция , влияние ожиданий типа LWLock на производительность СУБД отсутствует.
В принципе - ничего неожиданного. Наивно было бы ожидать от алгоритма статистической обработки текстов в интернете исследований и логических выводов, тем более в отсутствии материалов и результатов реальных экспериментов.
Какие события ожидания(wait_event) СУБД PostgreSQL характерны при предельной утилизации CPU ?
Ответ YandexGPT
При высокой утилизации CPU в PostgreSQL наблюдаются следующие характерные события ожидания (wait_event):
ProcArray - ожидание при обращении к общим структурам данных в рамках процесса. Возникает, например, при получении снимка или чтении идентификатора транзакции в сеансе.
LockManager - ожидание при чтении или изменении информации о «тяжёлых» блокировках.
Важно отметить, что при нехватке вычислительных ресурсов CPU наблюдается сильная корреляция между снижением операционной скорости СУБД и ростом ожиданий типа ProcArray. Это является характерным признаком того, что система испытывает дефицит процессорных ресурсов.
Также при высокой утилизации CPU наблюдается сильная корреляция между ожиданиями и ожиданиями типа LWLock, что указывает на то, что большинство возникающих ожиданий связано именно с этим типом блокировок.
Забавное , или интересное в ответе нейросети YandexGPT в том, что , я точно знаю откуда взята данная цитата : https://dzen.ru/a/Z_decDLxQCTdLsJ2
Как большое количество мертвых строк влияет на время выполнения select ?
Из ответа нейросети
Основные причины влияния мертвых строк на SELECT: ... 2. Ухудшение эффективности индексов Индексы, построенные на таблице, также содержат ссылки на мёртвые строки. Это может привести к тому, что при использовании индекса для поиска данных, система будет проверять больше записей, чем необходимо, что замедляет выполнение запроса. ... Как уменьшить влияние мёртвых строк ? ... 4. Использование индексов Правильно настроенные индексы позволяют быстрее находить нужные данные, минуя мёртвые строки.
Как это понимать ? А вот как хочешь , так и понимай :-)