19.10. Очистка #

Эти параметры управляют поведением очистки. За подробностями о целях и функциональности очистки обратитесь к Разделу 24.1.

19.10.1. Автоматическая очистка #

Эти параметры управляют поведением механизма автоочистки. За дополнительными сведениями обратитесь к Подразделу 24.1.6. Заметьте, что многие из этих параметров могут быть переопределены на уровне таблиц; см. Параметры хранения.

autovacuum (boolean) #

Управляет состоянием демона, запускающего автоочистку. По умолчанию он включён, но чтобы автоочистка работала, нужно также включить track_counts. Задать этот параметр можно только в postgresql.conf или в командной строке при запуске сервера. Однако автоочистку можно отключить для отдельных таблиц, изменив их параметры хранения.

Заметьте, что даже если этот параметр отключён, система будет запускать процессы автоочистки, когда это необходимо для предотвращения зацикливания идентификаторов транзакций. За дополнительными сведениями обратитесь к Подразделу 24.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.relfrozenxid некоторой таблицы, при достижении которого будет запущена операция VACUUM для предотвращения зацикливания идентификаторов транзакций в этой таблице. Заметьте, что система запустит процессы автоочистки для предотвращения зацикливания, даже если для всех других целей автоочистка отключена.

При очистке могут также удаляться старые файлы из подкаталога pg_xact, поэтому значение по умолчанию сравнительно мало — 200 миллионов транзакций. Задать этот параметр можно только при запуске сервера, но для отдельных таблиц его можно определить по-другому, изменив их параметры хранения. За дополнительными сведениями обратитесь к Подразделу 24.1.5.

autovacuum_multixact_freeze_max_age (integer) #

Задаёт максимальный возраст (в мультитранзакциях) для поля pg_class.relminmxid таблицы, при достижении которого будет запущена операция VACUUM для предотвращения зацикливания идентификаторов мультитранзакций в этой таблице. Заметьте, что система запустит процессы автоочистки для предотвращения зацикливания, даже если для всех других целей автоочистка отключена.

При очистке мультитранзакций могут также удаляться старые файлы из подкаталогов pg_multixact/members и pg_multixact/offsets, поэтому значение по умолчанию сравнительно мало — 400 миллионов мультитранзакций. Этот параметр можно задать только при запуске сервера, но для отдельных таблиц его можно определить по-другому, изменив их параметры хранения. За дополнительными сведениями обратитесь к Подразделу 24.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 или в командной строке при запуске сервера. Однако его можно переопределить для отдельных таблиц, изменив их параметры хранения.

19.10.2. Задержка очистки по стоимости #

Во время выполнения команд VACUUM и ANALYZE система ведёт внутренний счётчик, в котором суммирует оцениваемую стоимость различных выполняемых операций ввода-вывода. Когда накопленная стоимость превышает предел (vacuum_cost_limit), процесс, выполняющий эту операцию, засыпает на некоторое время (vacuum_cost_delay). Затем счётчик сбрасывается и процесс продолжается.

Данный подход реализован для того, чтобы администраторы могли снизить влияние этих команд на параллельную работу с базой, за счёт уменьшения нагрузки на подсистему ввода-вывода. Очень часто не имеет значения, насколько быстро выполнятся команды обслуживания (например, 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.

19.10.3. Поведение по умолчанию #

vacuum_truncate (boolean) #

Включает или отключает попытку процесса очистки усекать пустые страницы в конце таблицы. Значение по умолчанию — true. Если оно задано, команда VACUUM и процесс автоочистки выполняют усечение, а дисковое пространство, освободившееся от усечённых страниц, возвращается операционной системе. Обратите внимание, что для усечения требуется блокировка ACCESS EXCLUSIVE для таблицы. Если задан параметр TRUNCATE команды VACUUM, он переопределяет значение этого параметра. Этот параметр можно также переопределить для отдельных таблиц, изменив их параметры хранения.

19.10.4. Заморозка #

Чтобы обеспечить корректность работы даже после зацикливания идентификаторов транзакций, PostgreSQL помечает достаточно старые строки как замороженные. Такие строки видимы всем. Другим транзакциям не требуется проверять свои добавляющие XID, чтобы определить видимость. За пометку строк как замороженных отвечает команда VACUUM. Следующие параметры управляют поведением замораживания строк VACUUM и должны устанавливаться с учётом скорости расходования XID в системе и особенностей доступа к данным в основных рабочих нагрузках. Подробнее о зацикливании идентификаторов транзакций и установке этих параметров см. Подраздел 24.1.5.

vacuum_freeze_table_age (integer) #

Задаёт максимальный возраст для поля pg_class.relfrozenxid таблицы, при достижении которого VACUUM будет производить агрессивное сканирование. Агрессивное сканирование отличается от обычного сканирования VACUUM тем, что затрагивает все страницы, которые могут содержать незамороженные XID или MXID, а не только те, что могут содержать мёртвые кортежи. Значение по умолчанию — 150 миллионов транзакций. Хотя пользователи могут задать любое значение от нуля до двух миллиардов, в VACUUM введён внутренний предел для действующего значения, равный 95% от autovacuum_freeze_max_age, чтобы периодически запускаемая вручную команда VACUUM имела шансы выполниться, прежде чем для таблицы будет запущена автоочистка для предотвращения зацикливания. За дополнительными сведениями обратитесь к Подразделу 24.1.5.

vacuum_freeze_min_age (integer) #

Задаёт возраст для отсечки (в транзакциях), при достижении которого команда VACUUM должна вызывать замораживание страниц с более ранними XID. Значение по умолчанию — 50 миллионов транзакций. Хотя пользователи могут задать любое значение от нуля до одного миллиарда, в VACUUM введён внутренний предел для действующего значения, равный половине autovacuum_freeze_max_age, чтобы принудительная автоочистка выполнялась не слишком часто. За дополнительными сведениями обратитесь к Подразделу 24.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) #

Задаёт максимальный возраст для поля pg_class.relminmxid таблицы, при достижении которого команда VACUUM будет выполнять агрессивное сканирование. Агрессивное сканирование отличается от обычного сканирования VACUUM тем, что затрагивает все страницы, которые могут содержать незамороженные XID или MXID, а не только те, что могут содержать мёртвые кортежи. Значение по умолчанию — 150 миллионов мультитранзакций. Хотя пользователи могут задать любое значение от нуля до двух миллиардов, в VACUUM введён внутренний предел для действующего значения, равный 95% от autovacuum_multixact_freeze_max_age, чтобы периодически запускаемая вручную команда VACUUM имела шансы выполниться, прежде чем для таблицы будет запущена автоочистка для предотвращения зацикливания. За дополнительными сведениями обратитесь к Подразделу 24.1.5.1.

vacuum_multixact_freeze_min_age (integer) #

Задаёт возраст для отсечки (в мультитранзакциях), при достижении которого команда VACUUM должна вызывать замораживание страниц с более ранними идентификаторами мультитранзакций. Значение по умолчанию — 5 миллионов мультитранзакций. Хотя пользователи могут задать любое значение от нуля до одного миллиарда, в VACUUM введён внутренний предел для действующего значения, равный половине autovacuum_multixact_freeze_max_age, чтобы принудительная автоочистка не выполнялась слишком часто. За дополнительными сведениями обратитесь к Подразделу 24.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 или в командной строке при запуске сервера. Однако его можно переопределить для отдельных таблиц, изменив соответствующий параметр хранения. За подробностями о настройке поведения заморозки очистки обратитесь к Подразделу 24.1.5.