Ускоряем VACUUM в PostgreSQL
Пару дней назад к нам поступил вопрос – можно ли ускорить процесс VACUUMа на больших таблицах в момент когда процесс уже запущен.
В кратце, нет, VACUUM ускорить нельзя, но я отвечу на этот вопрос немного более развернуто.
После того как VACUUM начал работать на его скорость нельзя прямо воздействовать. Это связано с тем, что основная работа уходит на дисковые операции, а они не очень быстрые. Так же необходимо оставить ресурсы для выполнения обычных запросов к базе.
Несмотря на это можно выполнить настройки системы, при которых отдельный VACUUM будет отрабатывать быстрее.
Для этого обычно настраивают достаточно агрессивный стиль работы. При этом процессы VACUUM (точнее, AUTOVACUUM) запускаются чаще, но при каждом запуске от них требуется меньше действий, что существенно снижает время работы.
Для этого рекомендуется выставить параметры AUTOVACUUM:
- Выделяют подходящее кол-во процессов
autovacuum_max_workers
(по умолчанию 3 – это мало. Лучше выставить 10). - Увеличивают частоту запуска проверок на AUTOVACUUM (
autovacuum_naptime
= 1s. Значение по умолчанию – 1min). - Снижают пороги, при которых срабатывает AUTOVACUUM (
autovacuum_vacuum_threshold
= 50,autovacuum_analyze_threshold
= 10,autovacuum_vacuum_scale_factor
= 0.05,autovacuum_analyze_scale_factor
= 0.05). - Снижают пороги, при которых происходит FREEZE (
vacuum_freeze_min_age
= 5000000,vacuum_freeze_table_age
= 15000000).
Параметр autovacuum_max_workers
требует перезапуска сервиса, a остальные можно применить во время работы.
Указанные выше параметры заставят AUTOVACUUM чаще посещать таблицы и отрабатывать на более мелкой порции изменений.
После этого при вызове команды VACUUM на ее долю достанется относительно небольшой обьем работы, что существенно ускорит выполнение команды.
Так же можно выставить агрессивные параметры непосредственно для команды VACUUM (vacuum_cost_delay
= 0, vacuum_cost_page_hit
= 0, vacuum_cost_page_miss
= 1, vacuum_cost_page_dirty
= 10, vacuum_cost_limit
= 100), что позволяет использовать больше ресурсов за счет остальных процессов сервера и уменьшить паузы в работе.
Узнать больше про работу с VACUUM можно из наших статей и доклада с PGCon.