18.10. Вакуумирование#
18.10. Вакуумирование #
Эти параметры управляют поведением очистки (vacuuming). Для получения дополнительной информации о назначении и задачах очистки см. Раздел 23.1.
18.10.1. Автоматическая очистка #
Эти настройки контролируют поведение функции автоочистки. См. Раздел 23.1.6 для получения дополнительной информации. Обратите внимание, что многие из этих настроек могут быть переопределены на уровне отдельных таблиц; см. Storage Parameters.
autovacuum(boolean) #Управляет работой демона, запускающего автоочистку. По умолчанию включено; однако для работы автоочистки также необходимо включить track_counts. Этот параметр можно задать только в файле
postgresql.confили в командной строке сервера; однако автоочистку можно отключить для отдельных таблиц, изменив соответствующие параметры хранения.Обратите внимание, что даже когда этот параметр отключён, система будет при необходимости запускать процессы автоочистки для предотвращения зацикливания счетчика транзакций. Смотрите Раздел 23.1.5 для получения дополнительной информации.
autovacuum_worker_slots(integer) #Задает количество слотов серверных процессов, резервируемых для рабочих процессов автоочистки. По умолчанию обычно выделяется 16 слотов, но это значение может быть меньше, если параметры вашего ядра не поддерживают такое значение (определяется на этапе initdb). Этот параметр можно задать только при запуске сервера.
При изменении данного значения рассмотрите возможность также корректировки autovacuum_max_workers.
autovacuum_max_workers(integer) #Задает максимальное количество процессов автоочистки (кроме процесса, запускающего автоочистку), которые могут выполняться одновременно. Значение по умолчанию —
3. Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера.Обратите внимание, что если значение этого параметра, превышает autovacuum_worker_slots, не он не будет работать, поскольку процессы автоочистки берутся из пула слотов, установленного этим параметром.
autovacuum_naptime(integer) #Задает минимальную задержку между запусками автоочистки для отдельной базы данных. В каждом цикле демон проверяет базу данных и выдает команды
VACUUMиANALYZEпо мере необходимости для таблиц в этой базе данных. Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение задержки по умолчанию — одна минута (1min). Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера.autovacuum_vacuum_threshold(integer) #Задает минимальное количество изменённых или удалённых кортежей, необходимое для запуска
VACUUMв отдельной взятой таблице. Значение по умолчанию — 50 кортежей. Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера; однако значение можно переопределить для отдельных таблиц, изменив их параметры хранения.autovacuum_vacuum_insert_threshold(integer) #Задает количество добавленных кортежей, необходимое для запуска
VACUUMв отдельно взятой таблице. Значение по умолчанию — 1000 кортежей. Если указано -1, автоочистка не будет запускать операциюVACUUMдля таблиц на основе количества добавленных строк. Этот параметр можно задать только в файлеpostgresql.confили в командной строке сервера; однако значение можно переопределить для отдельных таблиц, изменив их параметры хранения.autovacuum_analyze_threshold(integer) #Задает минимальное количество добавленных, измененных или удаленных кортежей, необходимое для запуска
ANALYZEв отдельно взятой таблице. Значение по умолчанию — 50 кортежей. Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера; однако значение можно переопределить для отдельных таблиц, изменив их параметры хранения.autovacuum_vacuum_scale_factor(floating point) #Задает процент от размера таблицы, который добавляется к
autovacuum_vacuum_thresholdпри выборе порога срабатыванияVACUUM. Значение по умолчанию —0.2(20% от размера таблицы). Этот параметр можно задать только в файлеpostgresql.confили в командной строке сервера; однако значение можно переопределить для отдельных таблиц, изменив их параметры хранения.autovacuum_vacuum_insert_scale_factor(floating point) #Задает процент от незамороженных страниц в таблице, который добавляется к
autovacuum_vacuum_insert_thresholdпри выборе порога срабатыванияVACUUM. Значение по умолчанию —0.2(20% от незамороженных страниц в таблице). Этот параметр можно задать только в файлеpostgresql.confили в командной строке сервера; однако значение можно переопределить для отдельных таблиц, изменив их параметры хранения.autovacuum_analyze_scale_factor(floating point) #Определяет долю размера таблицы, добавляемую к параметру
autovacuum_analyze_thresholdпри принятии решения о запуске командыANALYZE. По умолчанию установлено значение 0.1 (10% от размера таблицы). Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера; однако это значение можно переопределить для отдельных таблиц, изменяя параметры хранения таблицы.autovacuum_vacuum_max_threshold(integer) #Задает максимальное количество измененных или удалённых кортежей, необходимое для запуска
VACUUMв отдельно взятой таблице, то есть ограничение на значение, вычисленное с учетом параметровautovacuum_vacuum_thresholdиautovacuum_vacuum_scale_factor. Значение по умолчанию — 100 000 000 кортежей. Если указано -1, автоочистка не будет применять ограничение к операцииVACUUMпо количеству измененных или удалённых кортежей. Установить этот параметр можно только в файлеpostgresql.confили в командной строке сервера; однако эту настройку можно переопределить для отдельных таблиц, изменяя параметры хранения таблицы.autovacuum_freeze_max_age(integer) #Задает максимальный возраст (в транзакциях) для поля
pg_classотдельной таблицы, при достижении которого запускается операцияVACUUMдля предотвращения зацикливания счетчика транзакций в таблице. Обратите внимание, что система запустит автоочистку для предотвращения переполнения даже в том случае, если автоочистка отключёна для прочих целей.При очистке также могут удаляться старые файлы из подкаталога
pg_xact, поэтому значение по умолчанию относительно невелико — 200 миллионов транзакций. Этот параметр можно установить только при запуске сервера, но для отдельных таблиц его значение можно уменьшить, изменив параметры хранения таблицы. Для получения дополнительной информации смотрите Раздел 23.1.5.autovacuum_multixact_freeze_max_age(integer) #Задает максимальный возраст (в мультитранзакциях) для поля
pg_class.relminmxidданной таблицы, прежде чем будет принудительно выполнена операцияVACUUMдля предотвращения зацикливания счетчика мультитранзакций. Обратите внимание, что система запустит процессы автоочистки для предотвращения переполнения даже в том случае, если автоочистка для прочих целей отключёна.При очистке мультитранзакций также могут удаляться старые файлы из подкаталогов
pg_multixact/membersиpg_multixact/offsets, поэтому значение по умолчанию относительно невелико — 400 миллионов мультитранзакций. Этот параметр можно установить только при запуске сервера, но для отдельных таблиц его значение можно уменьшить, изменив параметры хранения таблицы. Для получения дополнительной информации смотрите Раздел 23.1.5.1.autovacuum_vacuum_cost_delay(floating point) #Задает значение при превышении стоимости, которое будет использоваться в автоматических операциях
VACUUM. Если указано -1, используется обычное значение vacuum_cost_delay. Если значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 2 миллисекунды. Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера; однако настройка может быть переопределена для отдельных таблиц путем изменения их параметров хранения.autovacuum_vacuum_cost_limit(integer) #Задает значение предела стоимости, которое будет использоваться в автоматических операциях
VACUUM. Если указано-1(что является значением по умолчанию), используется обычное значение vacuum_cost_limit. Обратите внимание, что значение распределяется пропорционально между работающими процессами автоочистки, если их несколько, так что сумма пределов всех процессов не превышает значение этого параметра. Этот параметр может быть установлен только в файлеpostgresql.confили в командной строке сервера; однако настройка может быть переопределена для отдельных таблиц путем изменения их параметров хранения.
18.10.2. Задержка очистки на основе стоимости #
Во время выполнения команд VACUUM и ANALYZE система поддерживает внутренний счетчик, который отслеживает оценочную стоимость различных операций ввода-вывода, выполняемых. Когда накопленная стоимость достигает предела (указанного в vacuum_cost_limit), процесс, выполняющий операцию, будет спать в течение короткого периода времени, указанного в vacuum_cost_delay. Затем он сбросит счетчик и продолжит выполнение.
Целью этой функции является позволить администраторам снизить влияние операций на поддержку базы данных, таких как VACUUM и ANALYZE, на одновременную активность базы данных. Существует множество ситуаций, когда не важно, чтобы поддерживающие команды, такие как VACUUM и ANALYZE, выполнялись быстро; однако, обычно очень важно, чтобы эти команды не существенно вмешивались в возможность системы выполнять другие операции с базой данных. Задержка очистки на основе стоимости предоставляет администраторам возможность достичь этого.
Эта функция по умолчанию отключена для команд VACUUM, выполняемых вручную. Чтобы включить ее, установите переменную vacuum_cost_delay в ненулевое значение.
vacuum_cost_delay(floating point) #Количество времени, в течение которого процесс будет неактивным, при превышении предела стоимости. Если значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию —
0отключает функцию задержки очистки на основе стоимости. Положительные значения включают очистку на основе стоимости.При использовании очистки на основе стоимости, подходящие значения для параметра
vacuum_cost_delayобычно достаточно малы, возможно, меньше 1 миллисекунды. В то время как параметрvacuum_cost_delayможет быть установлен с дробными значениями в миллисекундах, такие задержки могут измеряться неточно на старых платформах. На таких платформах увеличение регулируемого потребления ресурсовVACUUMвыше значения 1 мс потребует изменения других параметров стоимости очистки. Тем не менее, необходимо, чтобы значение параметраvacuum_cost_delayбыло как можно меньше, чтобы ваша платформа могла точно измерять его; большие задержки не рекомендуются.vacuum_cost_page_hit(integer) #Примерная стоимость очистки буфера, найденного в общем кеше буферов. Она складывается из стоимости блокировки пула буферов, поиска в общей хеш-таблице и сканирования содержимого страницы. Значение по умолчанию —
1.vacuum_cost_page_miss(integer) #Примерная стоимость очистки буфера, который необходимо считать с диска. Она складывается из затрат на блокировку пула буферов, поиска в общей хеш-таблице, чтения нужного блока с диска и сканирование его содержимого. Значение по умолчанию —
2.vacuum_cost_page_dirty(integer) #Примерная стоимость очистки, при которой изменяется блок, который ранее не менялся. Она складывается из стоимости дополнительных операций ввода-вывода, необходимых для записи изменённого блока на диск. Значение по умолчанию —
20.vacuum_cost_limit(integer) #Общая накопленная стоимость, при достижении которой процесс очистки будет засыпать на время, заданное параметром
vacuum_cost_delay. Значение по умолчанию —200.
Примечание
Существуют определенные операции, которые занимают критические блокировки и должны завершаться как можно быстрее. Во время таких операций не происходит задержек, основанных на стоимости очистки. Поэтому возможно, что стоимость будет накапливаться гораздо выше указанного предела. Чтобы избежать бесполезно длительных задержек в таких случаях, фактическая задержка рассчитывается как vacuum_cost_delay * accumulated_balance / vacuum_cost_limit с максимальным значением vacuum_cost_delay * 4.
18.10.3. Поведение по умолчанию #
vacuum_truncate(boolean) #Включает или отключает попытку процесса очистки усекать пустые страницы в конце таблицы. Значение по умолчанию —
true. Если установлено вtrue, то командаVACUUMи процесс автоочистки обрезает страницы, и дисковое пространство, освобожденное от усечённых страниц возвращается операционной системе. Обратите внимание, что для усечения требуется блокировка таблицы уровняACCESS EXCLUSIVE. ПараметрTRUNCATEкомандыVACUUM, если он указан, переопределяет значение этого параметра. Также параметр может быть переопределен для отдельных таблиц путём изменения параметров хранения таблицы.
18.10.4. Заморозка #
Для обеспечения корректности работы даже после зацикливания идентификаторов транзакций,
Tantor BE помечает достаточно старые строки как замороженные. Эти строки видны всем;
другим транзакциям не нужно проверять XID транзакций, вставивших строки, для
определения видимости. За пометку строк как замороженных отвечает команда VACUUM.
Следующие параметры управляют поведением замораживания VACUUM и должны настраиваться в зависимости
от скорости расхода XID в системе и особенностей доступа к данным в основных рабочих нагрузках.
См. Раздел 23.1.5 для получения дополнительной информации о зацикливании идентификаторов транзакций и настройке этих параметров.
vacuum_freeze_table_age(integer) #VACUUMвыполняет агрессивное сканирование, когда полеpg_class.relfrozenxidтаблицы достигает заданного в этом параметре возраста. Агрессивное сканирование отличается от обычного сканированияVACUUMтем, что просматривается каждая страница, которая может содержать незамороженные XID или MXID, а не только страницы, которые могут содержать "мертвые" кортежи. Значение по умолчанию — 150 миллионов транзакций. Хотя пользователи могут установить это значение в диапазоне от нуля до двух миллиардов,VACUUMбез уведомления ограничит эффективное значение до 95% от autovacuum_freeze_max_age, чтобы периодически запускаемая ручная операцияVACUUMмогла выполниться до того, как для таблицы будет запущена автоочистка, для предотвращения зацикливания идентификаторов транзакций. Для получения дополнительной информации смотрите Раздел 23.1.5.vacuum_freeze_min_age(integer) #Задает возраст для отсечки (в транзакциях), при достижении которого, команда
VACUUMзаморозки страниц со старым XID транзакций. Значение по умолчанию — 50 миллионов транзакций. Хотя пользователи могут установить это значение в диапазоне от нуля до одного миллиарда,VACUUMбез уведомления ограничит фактическое значение половиной значения autovacuum_freeze_max_age, чтобы избежать слишком частых операций принудительной автоочистки. Для получения дополнительной информации смотрите Раздел 23.1.5.vacuum_failsafe_age(integer) #Указывает максимальный возраст (в транзакциях), которого может достичь поле
pg_class.relfrozenxidтаблицы, прежде чемVACUUMпредпримет чрезвычайные меры для предотвращения сбоя из-за зацикливания счетчика транзакций в системе. Это стратегияVACUUMна крайний случай. Обычно аварийный механизм срабатывает, когда автоочистка для предотвращения зацикливания счетчика транзакций уже выполняется некоторое время, хотя возможно срабатывание аварийного механизма и во время любогоVACUUM.При срабатывании аварийной защиты, никакая действующая задержка на основе стоимости, больше не применяется, дальнейшие несущественные задачи обслуживания (такие как очистка индексов) пропускаются, и любая используемая стратегия доступа к буферам отключается, в результате чего
VACUUMсможет свободно использовать все общие буферы.Значение по умолчанию — 1,6 миллиарда транзакций. Хотя пользователи могут установить это значение в пределах от нуля до 2,1 миллиарда,
VACUUMавтоматически и без уведомления увеличит значение так, чтобы оно было не менее 105% от autovacuum_freeze_max_age.vacuum_multixact_freeze_table_age(integer) #VACUUMвыполняет агрессивное сканирование, когда полеpg_class.relminmxidтаблицы достигает заданного в этом параметре возраста. Агрессивное сканирование отличается от обычного сканированияVACUUMтем, что просматривается каждая страница, которая может содержать незамороженные XID или MXID, а не только страницы, которые могут содержать "мертвые" кортежи. Значение по умолчанию — 150 миллионов транзакций. Хотя пользователи могут установить это значение в диапазоне от нуля до двух миллиардов,VACUUMбез уведомления ограничит эффективное значение до 95% от autovacuum_multixact_freeze_max_age, чтобы периодически запускаемая ручная операцияVACUUMмогла выполниться до того, как для таблицы будет запущена автоочистка, для предотвращения зацикливания. Для получения дополнительной информации смотрите Раздел 23.1.5.1.vacuum_multixact_freeze_min_age(integer) #Задает возраст для отсечки (в мультитранзакциях), при достижении которого, команда
VACUUMзаморозки страниц со старым XID мультитранзакций. Значение по умолчанию — 5 миллионов мультитранзакций. Хотя пользователи могут установить это значение в диапазоне от нуля до одного миллиарда,VACUUMбез уведомления ограничит фактическое значение половиной значения autovacuum_multixact_freeze_max_age, чтобы избежать слишком частых операций принудительной автоочистки. Для получения дополнительной информации смотрите Раздел 23.1.5.1.vacuum_multixact_failsafe_age(integer) #Задает максимальный возраст (в мультитранзакциях) для поля
pg_class.relminmxidтаблицы, при достижения которогоVACUUMпредпримет чрезвычайные меры для предотвращения сбоя из-за зацикливания счетчика мультитранзакций во всей системе. Это стратегия защитыVACUUMприменяется только в крайнем случае. Обычно этот режим включается, когда автоочистка для предотвращения зацикливания счетчика транзакций уже выполняется некоторое время, хотя возможно срабатывание защиты и во время любой операцииVACUUM.Когда срабатывает аварийная защита, любая действующая задержка на основе стоимости, больше не применяется, и дальнейшие необязательные задачи обслуживания (такие как очистка индексов) пропускаются.
Значение по умолчанию — 1,6 миллиарда мультитранзакций. Хотя пользователи могут установить это значение в пределах от нуля до 2,1 миллиарда,
VACUUMавтоматически скорректирует значение так, чтобы оно было не менее 105% от autovacuum_multixact_freeze_max_age.vacuum_max_eager_freeze_failure_rate(floating point) #Указывает максимальное количество страниц (как процент от общего количества страниц отношения), которые
VACUUMможет просканировать и не отметить как полностью замороженные в карте видимости, прежде чем отключить режим энергичного сканирования. Значение0полностью отключает энергичное сканирование. Значение по умолчанию —0.03(3%).Обратите внимание, что когда включено нетерпеливое сканирование, только неудачные попытки заморозки учитываются в ограничении, а успешные заморозки не учитываются. Успешные заморозки страниц контролируются внутренним ограничением на уровне 20% от всех видимых, но не полностью замороженных страниц отношения. Ограничение на количество успешных заморозок страниц помогает распределить издержки между несколькими обычными операциями очистки и ограничивает возможные потери от ненужных операций нетерпеливой заморозки страниц, которые будут изменены снова до следующей агрессивной очистки.
Параметр можно установить только в файле
postgresql.confили в командной строке сервера; однако значение можно переопределить для отдельных таблиц, изменив соответствующий параметр хранения таблицы. Для получения дополнительной информации о настройке поведения заморозки очистки см. Раздел 23.1.5.