Задачи эксперимента
Оценить степень влияния регулярного выполнения vacuum/analyze на производительность СУБД.
Оценить степень влияния распухания таблицы на производительность СУБД.
Реализация эксперимента
Для краткости, конкретные значения параметров настройки вакуума и анализа, пока вынесены за рамки данной статьи.
Одна итерация теста состоит из транзакции select/insert/update/delete ( количество строк в таблицах ~1 000 000).
Количество итераций = 1000.
Оцениваемые результаты
Общее время выполнения (total_exec_time представления pg_stat_statements)
Количество запросов (calls представления pg_stat_statements)
Количество результирующих строк (rows представления pg_stat_statements)
Общее число прочитанных разделяемых блоков (shared_blks_read представления pg_stat_statements)
Общее число «загрязнённых» разделяемых блоков (shared_blk_dirtied представления pg_stat_statements)
Общее число записанных разделяемых блоков (shared_blk_written представления pg_stat_statements)
Количество транзакций (xact_commit представления pg_stat_database)
Метрика производительности СУБД (CPI)
Результаты эксперимента
Эталонный тест: vacuum + analyze после каждой итерации
Тест без выполнения vacuum + analyze после каждой итерации
Сравнение результатов с «Эталонный тест: vacuum + analyze после каждой итерации»
Время выполнения теста — незначительно уменьшилось
Объем обработанных разделяемых блоков — значительно увеличился
Производительность — существенно уменьшилась
Фрагментация 11%
Сравнение результатов с «Тест без выполнения vacuum + analyze после каждой итерации»
Время выполнения теста — существенно увеличилось
Объем обработанных разделяемых блоков — существенно увеличился
Производительность — существенно уменьшилась
Фрагментация 100%
Сравнение результатов с «Тест без выполнения vacuum + analyze после каждой итерации»
Время выполнения теста — существенно увеличилось
Объем обработанных разделяемых блоков — существенно увеличился
Производительность — существенно уменьшилась
Итоги
Выполнение vacuum+analyze после массовых изменений данных существенно увеличивает производительность СУБД, хотя общее время выполнения и несколько возрастает.
Даже относительно небольшая фрагментация оказывает существенное влияние на производительность СУБД.
Дальнейшее увеличение фрагментации не оказывает заметного влияния на производительность СУБД.
Мониторить и оптимизировать надо не фрагментацию БД в целом, а фрагментацию наиболее часто используемых таблиц.
Комментарии (5)
Hamletghost
23.09.2024 15:49Это все конечно здорово, но совершенно оторвано от реальности.
К сожалению Autocacuum постгреса, точнее алгоритм его запуска реализован слишком топорно.
Пример из жизни: кластер с одной синхронной репликой (которая используется для r/o аналитических запросов ). В какой-то момент складывается такая ситуация: в одной из крупных таблиц происходит много изменений, тригерится autocacuum и… он ничего не может собрать потому что, ну вот так совпало, что на реплике запустился какой-то тяжелый долгий запрос из-за чего на мастере xid остались заморожены до окончания запроса. Но условие срабатывания автовакума все еще валидно и вот он запускается снова и снова, сканирует это огромную таблицу, высаживая io и сжигая cpu.
Да и в принципе этот механизм так устроен, что он будет запускаться именно в часы наибольшей нагрузки (по очевидным причинам) - иногда добивая загрузку свободных ядер до 100%
Я знаю про все его настройки - баланс там найти сложно. Мечтаю, что когда-нибудь он научится адаптироваться к нагрузке и делать больше пауз, если бд и так перегружена
rinace Автор
23.09.2024 15:49А пробовали настраивать вакуум не для кластера в целом , для таблиц отдельно ?
Hamletghost
23.09.2024 15:49+2На большой бд только так и можно жить.
Дефолтные настройки для мелких таблиц
Все крупные таблицы имеют свои трешолды в зависимости от интенсивности их изменений
А на самых больших автовакуум вообще приходится выключать и запускать вакуум по старинке из планировщика (pg_cron) в часы наименьшей нагрузки
baldr
Идея провести тесты хорошая. Но выводы капитанские. Особенно когда в статье не приведены ни параметры базы, ни параметры сервера (может у вас там Windows-виртуалка в облаке с 1Гб памяти) , ни схема таблиц и данных, ни тесты....
Поставил плюс статье, но могло быть и лучше.
rinace Автор
Если вам , действительно интересны детали, ок , принято добавлю чуть больше деталей, попозже. Эксперименты будут продолжены, очень интересно, как там с ожиданиями и корреляциями обстоит дело .Не знаю как вам , но мне, показалось очень интересным и не так уж и очевидным - несущественная разница между уровнем фрагментации 11% и 100%.Ожидал , что то типа логарифмической зависимости .