Найти в Дзене
Postgres DBA

Информация к размышлению - autovacuum_vacuum_delay/autovacuum_cost_limit

Оглавление

Вопрос

Kак увеличение или уменьшение параметра autovacuum_vacuum_cost_limit при значении параметра autovacuum_vacuum_delay = 0 влияет на время работы процесса autovacuum для очень большой таблицы при интенсивных операциях UPDATE в СУБД PostgreSQL ?

RTFM-1(ответ нейросети DeepSeek)

⚠️При `autovacuum_vacuum_cost_delay = 0` параметр **`autovacuum_vacuum_cost_limit` не влияет на время работы процесса autovacuum**, так как механизм cost-based throttling полностью отключен. Объяснение:

Механизм работы:

1. autovacuum_vacuum_cost_delay = 0:

  - Отключает задержки (throttling) между операциями ввода-вывода при выполнении vacuum.

  ⚠️- Autovacuum работает без пауз, используя максимально доступные ресурсы I/O и CPU.

[т.е. если мертвые строки создаются во время работы autovacuum ➡️ процесс autovacuum будет работать непрерывно на фазе Scan Heap . добавлено мной ]

2. Роль `autovacuum_vacuum_cost_limit`:

  - Определяет условную "стоимостную квоту" (в условных единицах стоимости), после которой autovacuum должен сделать паузу, равную `autovacuum_vacuum_cost_delay`.

⚠️  - Но! Если `autovacuum_vacuum_cost_delay = 0`, то даже при достижении лимита пауза не выполняется. Autovacuum продолжает работу без прерываний.

Что происходит на практике?

- Autovacuum выполняет операции чтения/записи с максимальной скоростью, которую позволяют:

 - Производительность диска.

 - Настройки ОС (например, лимиты I/O).

 - Параметры PostgreSQL (например, `maintenance_io_concurrency`).

- Значение `autovacuum_vacuum_cost_limit` игнорируется, так как условие для паузы (`cost_delay > 0`) не выполняется.

Пример:

Два сценария при `autovacuum_vacuum_cost_delay = 0`:

1. `autovacuum_vacuum_cost_limit = 200` (значение по умолчанию) → Autovacuum работает на полной скорости.

2. `autovacuum_vacuum_cost_limit = 10000` → Autovacuum **также** работает на полной скорости.  

  ➠ Разницы во времени завершения вакуумирования **нет**.

ℹ️[Запланирован эксперимент. Добавлено мной]

⚠️Вывод:

При `autovacuum_vacuum_cost_delay = 0` изменение `autovacuum_vacuum_cost_limit` не влияет на скорость или время работы autovacuum. Процесс использует максимум ресурсов, и лимит стоимости игнорируется. Для контроля нагрузки используйте другие механизмы (например, настройки I/O ОС или увеличение `autovacuum_vacuum_cost_delay`)

RTFM-2 (ответ нейросети ChatPPG)

Влияние времени работы процесса autovacuum на параметр autovacuum_vacuum_cost_limit при autovacuum_vacuum_cost_delay = 0

⚠️При autovacuum_vacuum_cost_delay = 0, cost-based vacuum delay (затрата времени на вакуум) отключён. Это означает, что автовакуум не будет задерживаться из-за превышения лимита затрат, так как задержка не устанавливается.  

⚠️В этом случае autovacuum_vacuum_cost_limit (лимит затрат на вакуум) не уменьшается и не увеличивается в зависимости от времени работы процесса автовакуума.  

Пояснение:

- autovacuum_vacuum_cost_delay = 0 — отключает задержку, которая обычно используется для ограничения нагрузки на систему при выполнении вакуума. 

ℹ️- autovacuum_vacuum_cost_limit — это лимит затрат, при превышении которого процесс останавливается на время, указанное в autovacuum_vacuum_cost_delay. При autovacuum_vacuum_cost_delay = 0 этот лимит не активен, и автовакуум не будет его учитывать. 

Таким образом, время работы процесса автовакуума не влияет на autovacuum_vacuum_cost_limit, если autovacuum_vacuum_cost_delay = 0

Информация из документации:   

[https://postgrespro.com/docs/postgrespro/15/runtime-config-resource#RUNTIME-CONFIG-RESOURCE-VACUUM-COST](https://postgrespro.com/docs/postgrespro/15/runtime-config-resource#RUNTIME-CONFIG-RESOURCE-VACUUM-COST)

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

⚠️autovacuum_vacuum_cost_delay = 0

Для данной СУБД и данного сценария синтетической нагрузки. При нагрузке на СУБД с 5 до 115 одновременных соединений :

  • Повышение значения параметра autovacuum_vacuum_cost_limit до максимального значения 10 000 , при значении параметра autovacuum_vacuum_threshold = 1000 , приводит к повышению производительности в среднем до 2.24%.
  • Mаксимальный прирост производительности достигает 11.15%.

—————————

Запланированный эксперимент

  • autovacuum_vacuum_threshold = 1000
  • autovacuum_vacuum_cost_limit = 10000
  • autovacuum_vacuum_cost_delay = 1

Задача

Оценить влияние установки значения параметра autovacuum_vacuum_cost_delay

Гипотеза

Запланированный эксперимент по уменьшению значения autovacuum_vacuum_cost_limit = 2000 при autovacuum_vacuum_cost_delay =0 должен показать незначительное влияние(или отсутствие влияния) на производительность и статистику работы autovacuum.

P.S.

Запланировать эксперименты по сравнению основных настроек autovacuum :

◽autovacuum_vacuum_threshold

◽autovacuum_vacuum_cost_limit

◽autovacuum_vacuum_cost_delay