Задачи эксперимента

  1. Оценить степень влияния регулярного выполнения vacuum/analyze на производительность СУБД.

  2. Оценить степень влияния распухания таблицы на производительность СУБД.

Реализация эксперимента

Для краткости, конкретные значения параметров настройки вакуума и анализа, пока вынесены за рамки данной статьи.

Одна итерация теста состоит из транзакции select/insert/update/delete ( количество строк в таблицах ~1 000 000).

Количество итераций = 1000.

Оцениваемые результаты

  1. Общее время выполнения (total_exec_time представления pg_stat_statements)

  2. Количество запросов (calls представления pg_stat_statements)

  3. Количество результирующих строк (rows представления pg_stat_statements)

  4. Общее число прочитанных разделяемых блоков (shared_blks_read представления pg_stat_statements)

  5. Общее число «загрязнённых» разделяемых блоков (shared_blk_dirtied представления pg_stat_statements)

  6. Общее число записанных разделяемых блоков (shared_blk_written представления pg_stat_statements)

  7. Количество транзакций (xact_commit представления pg_stat_database)

  8. Метрика производительности СУБД (CPI)

Результаты эксперимента

Эталонный тест: vacuum + analyze после каждой итерации

Рис.1. Базовая нагрузка
Рис.1. Базовая нагрузка

Тест без выполнения vacuum + analyze после каждой итерации

Рис.2. Тест без vacuum+analyze
Рис.2. Тест без vacuum+analyze

Сравнение результатов с «Эталонный тест: vacuum + analyze после каждой итерации»

  • Время выполнения теста — незначительно уменьшилось

  • Объем обработанных разделяемых блоков — значительно увеличился

  • Производительность — существенно уменьшилась

Фрагментация 11%

Рис.3. Фрагментация 11%
Рис.3. Фрагментация 11%

Сравнение результатов с «Тест без выполнения vacuum + analyze после каждой итерации»

  • Время выполнения теста — существенно увеличилось

  • Объем обработанных разделяемых блоков — существенно увеличился

  • Производительность — существенно уменьшилась

Фрагментация 100%

Рис.4. Фрагментация 100%
Рис.4. Фрагментация 100%

Сравнение результатов с «Тест без выполнения vacuum + analyze после каждой итерации»

  • Время выполнения теста — существенно увеличилось

  • Объем обработанных разделяемых блоков — существенно увеличился

  • Производительность — существенно уменьшилась

Итоги

Выполнение vacuum+analyze после массовых изменений данных существенно увеличивает производительность СУБД, хотя общее время выполнения и несколько возрастает.

Даже относительно небольшая фрагментация оказывает существенное влияние на производительность СУБД.

Дальнейшее увеличение фрагментации не оказывает заметного влияния на производительность СУБД.

Мониторить и оптимизировать надо не фрагментацию БД в целом, а фрагментацию наиболее часто используемых таблиц.

Комментарии (5)


  1. baldr
    23.09.2024 15:49
    +2

    Идея провести тесты хорошая. Но выводы капитанские. Особенно когда в статье не приведены ни параметры базы, ни параметры сервера (может у вас там Windows-виртуалка в облаке с 1Гб памяти) , ни схема таблиц и данных, ни тесты....

    Поставил плюс статье, но могло быть и лучше.


    1. rinace Автор
      23.09.2024 15:49

      Если вам , действительно интересны детали, ок , принято добавлю чуть больше деталей, попозже. Эксперименты будут продолжены, очень интересно, как там с ожиданиями и корреляциями обстоит дело .Не знаю как вам , но мне, показалось очень интересным и не так уж и очевидным - несущественная разница между уровнем фрагментации 11% и 100%.Ожидал , что то типа логарифмической зависимости .


  1. Hamletghost
    23.09.2024 15:49

    Это все конечно здорово, но совершенно оторвано от реальности.

    К сожалению Autocacuum постгреса, точнее алгоритм его запуска реализован слишком топорно.

    Пример из жизни: кластер с одной синхронной репликой (которая используется для r/o аналитических запросов ). В какой-то момент складывается такая ситуация: в одной из крупных таблиц происходит много изменений, тригерится autocacuum и… он ничего не может собрать потому что, ну вот так совпало, что на реплике запустился какой-то тяжелый долгий запрос из-за чего на мастере xid остались заморожены до окончания запроса. Но условие срабатывания автовакума все еще валидно и вот он запускается снова и снова, сканирует это огромную таблицу, высаживая io и сжигая cpu.

    Да и в принципе этот механизм так устроен, что он будет запускаться именно в часы наибольшей нагрузки (по очевидным причинам) - иногда добивая загрузку свободных ядер до 100%

    Я знаю про все его настройки - баланс там найти сложно. Мечтаю, что когда-нибудь он научится адаптироваться к нагрузке и делать больше пауз, если бд и так перегружена


    1. rinace Автор
      23.09.2024 15:49

      А пробовали настраивать вакуум не для кластера в целом , для таблиц отдельно ?


      1. Hamletghost
        23.09.2024 15:49
        +2

        На большой бд только так и можно жить.

        Дефолтные настройки для мелких таблиц

        Все крупные таблицы имеют свои трешолды в зависимости от интенсивности их изменений

        А на самых больших автовакуум вообще приходится выключать и запускать вакуум по старинке из планировщика (pg_cron) в часы наименьшей нагрузки