Я пытаюсь заставить PostgreSQL активно пылесосить мою базу данных. В настоящее время я настроил автоматический вакуум следующим образом:
- autovacuum_vacuum_cost_delay = 0 # Отключить вакуум на основе стоимости
- autovacuum_vacuum_cost_limit = 10000 # Максимальное значение
- autovacuum_vacuum_threshold = 50 # Значение по умолчанию
- autovacuum_vacuum_scale_factor = 0.2 # Значение по умолчанию
Я заметил, что автоматический вакуум включается только тогда, когда база данных не загружена, поэтому я попадаю в ситуации, когда мертвых кортежей гораздо больше, чем живых кортежей. Смотрите прикрепленный скриншот для примера. Один из столов имеет 23 живых кортежа, но 16845 мертвых кортежей ожидают вакуума. Это безумие!
Автоматический вакуум включается, когда завершается тестовый прогон и сервер базы данных находится в режиме ожидания, а это не то, чего я хочу, поскольку я хотел бы, чтобы автоматический вакуум включался всякий раз, когда число мертвых кортежей превышает 20% живых кортежей + 50, поскольку база данных была сконфигурировано. Автоматический вакуум, когда сервер бездействует, для меня бесполезен, поскольку ожидается, что рабочий сервер будет работать с 1000-кратными обновлениями в секунду в течение длительного периода времени, поэтому мне нужно, чтобы автоматический вакуум работал даже при нагрузке на сервер.
Есть ли что-то, что я пропускаю? Как заставить автоматический вакуум работать, когда сервер находится под большой нагрузкой?
Обновить
Может ли это быть проблемой блокировки? Рассматриваемые таблицы являются сводными таблицами, которые заполняются с помощью триггера после вставки. Эти таблицы заблокированы в режиме SHARE ROW EXCLUSIVE, чтобы предотвратить одновременную запись в одну и ту же строку.
источник
Вероятно, поможет увеличение числа процессов в вакууме и сокращение времени бездействия. Вот конфигурация для PostgreSQL 9.1, которую я использую на сервере, который хранит информацию о резервных копиях и в результате получает много операций вставки.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Я также постараюсь понизить,
cost_delay
чтобы сделать пылесос более агрессивным.Я также могу проверить автоочистку с помощью pgbench.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Пример высокой конкуренции:
Создать базу данных bench_replication
Запустите pgbench
Проверьте состояние автоочистки
источник
Существующий сценарий "претендовать на автоочистку" очень полезен, но (как правильно сказано) не было конкретных параметров таблицы. Вот модифицированная версия, которая учитывает эти параметры:
источник