AUTOVACUUM – и никакой ручной работы

Итак, после небольшого перерыва, связанного с большой загрузкой на основной работе, я смог вернутся к написанию этой статьи, в которой я расскажу про AUTOVACUUM – крайне полезную вещь для поддержки БД в хорошем состоянии без лишней мороки.

Итак, что такое AUTOVACUUM? А это такая полезная штука, как автоматическая очистка таблиц при помощи команды VACUUM и ANALYZE, которая запускается периодически по достижению некоторых параметров. Эти параметры могут настраиваться через файл конфигурации, и тогда являются глобальными для всех таблиц в базе данных. А могут настраиваться на уровне конкретной таблицы, т.е. иметь локальный уровень и выполняться только для одной или нескольких таблиц по критериям и параметрам, заданным конкретно для этих таблиц.

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

Итак, эту опцию можно включить в файле конфигурации PostgreSQL. Когда она включена, PostgreSQL отслеживает таблицы которые должны быть почищены и для которых должна быть обновлена статистика. Обычно это таблицы, на которых происходит много операций обновления, удаления или вставки. И очень важный момент. Что бы AUTOVACUUM работал должна быть включена опция track_counts, которая включает сбор статистики при работе с базой данных. Эта статистика используется для определения количества вставок, обновлений и удалений на каждой таблице.

К счастью, по умолчанию track_counts и AUTOVACUUM включены. Так что все будет работать из коробки. Но для лучшей производительности именно для вашей базы данных вам нужно будет подстроить параметры.

Autovacuum Daemon

Autovacuum Daemon на самом деле состоит из нескольких процессов. Первичный и постоянный процесс называется autovacuum launcher. Этот процесс отвечает за запуск рабочих процессов для всех баз данных. autovacuum launcher распределяет работу по времени. Он запускает один рабочий процесс для каждой базы данных каждые autovacuum_naptime секунд. Поэтому, если у вас есть N баз данных, новый рабочий процесс будет запущен каждые autovacuum_naptime/N секунд. Максимальное количество рабочих процессов устанавливается опцией  autovacuum_max_workers. В случае, если есть больше, чем autovacuum_max_workers баз данных (имеется в виду для одного PostgreSQL сервера), подлежащих обработке, то в начале будет запущенно autovacuum_max_workers рабочих процессов, а остальные БД будут обрабатываться освободившимися рабочими процессами. Каждый рабочий процесс будет проверять каждую таблицу в своей базе данных и выполнять VACUUM и/или ANALYZE по мере необходимости. Параметр log_autovacuum_min_duration может быть использован для мониторинга активности AUTOVACUUM.

Если несколько больших таблиц получают право на AUTOVACUUM в короткий промежуток времени, все доступные рабочие процессы могут быть заняты обработкой этих таблиц на довольно долгое время. Т.е. в таком случае, остальные таблицы будут ждать своей очереди и не будут обработаны AUTOVACUUM пока не освободится один из занятых рабочих процессов. Важно понимать, что сервер   не накладывает никаких ограничений на количество рабочих процессов задействованных для одной базы данных. Но при этом, разные процессы не всегда будут выполнять уникальную работу и не пытаться обработать ту же самую таблицу дважды.

Обратите внимание, что количество рабочих процессов не учитывается для ограничений установленных в параметрах max_connections и superuser_reserved_connections.

Таблицы, чьи relfrozenxid значение больше, чем autovacuum_freeze_max_age, всегда выполняется AUTOVACUUM. Это также относится и к этим таблицам, у которых максимальный возраст заморозки был изменен с помощью параметров хранения. В противном случае, если число устаревших кортежей с момента последнего VACUUM превышает вакуумный порог, таблица подвергается обработке командой VACUUM. Вакуумный порог вакуум определяется следующим образом:

Tv = Tb + S * N

Где,

Tv – вакуумный порог

Tb – базовый порог очистки (vacuum base threshold)

S –коэффициент очистки (vacuum scale factor)

N – количество кортежей

Tb параметр берется из параметра autovacuum_vacuum_threshold  в конфигурационном файле

S параметр берется из параметра autovacuum_vacuum_scale_factor в конфигурационном файле

N параметр берется из значения pg_class.reltuples

Число устаревших кортежей берется из статистики. Это число (не точное, но очень близкое к реальному) обновляется каждой операцией UPDATE и DELETE. Это число не совсем точное, поскольку некоторая информация может быть потеряна при большой нагрузке на сервер. Если значение relfrozenxid таблицы больше, чем vacuum_freeze_table_age,  вся таблица сканируется, чтобы заморозить старые кортежи, в противном случае будут сканироваться только те страницы, которые были изменены с момента последней команды VACUUM.

Для команды ANALYZE используется похожая формула

Ta = Tb + S * N

Где,

Ta – порог для ANALYZE

Tb – базовый порог анализа (analyze base threshold)

S –коэффициент анализа (analyze scale factor)

N – количество кортежей

Полученное значение порога Ta сравнивается с общим количеством вставленных, обновленных или удаленных записей с момента последнего выполнения команды ANALYZE.

Временные таблицы не могут быть обработаны при помощи AUTOVACUUM. Поэтому целесообразно запускать эту команду для таких таблиц с помощью SQL консоли вручную. Конечно, если вам это нужно.

AUTOVACUUM настройки по умолчанию берутся из файла конфигурации postgresql.conf, но можно переназначить их для конкретных таблиц.

Смотрите следующую статью про стандартные настройки AUTOVACUUM доступные в файле конфигурации.

Добавить комментарий

Ваш e-mail не будет опубликован.