Postgresql 9.3 Autovacuum не поспевает, несмотря на агрессивные настройки

Попытка заставить Postgresql поддерживать чистоту таблиц, однако, даже после настройки ограничений ресурсов, похоже, не справляется с этим.

Даже после настройки

ALTER TABLE veryactivetable SET (autovacuum_vacuum_threshold = 10000);

pg_stat_user_tables для очень активных таблиц возвращает 63356 n_dead_tup и last_autoanalyze & last_autovacuum более 24 часов

Настройки posgresql.conf:

shared_buffers = 7680MB
work_mem = 39321kB

maintenance_work_mem = 1920MB

vacuum_cost_delay = 0
vacuum_cost_page_hit = 1000
vacuum_cost_page_miss = 1000
vacuum_cost_page_dirty = 2000
vacuum_cost_limit = 7000


autovacuum = on
log_autovacuum_min_duration = 0
autovacuum_max_workers = 10
autovacuum_naptime = 10s
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.05
autovacuum_freeze_max_age = 200000000
autovacuum_vacuum_cost_delay = 50ms
autovacuum_vacuum_cost_limit = 7000

1 ответ

Задавать autovacuum_vacuum_scale_factor а также autovacuum_analyze_scale_factor к более высокому значению, вероятно, лучше вернуться к значению по умолчанию. Нет необходимости позволять автоочистке работать чаще, чем необходимо, особенно в вашей ситуации. Идея состоит в том, чтобы сделать это быстро, как только оно начнется.

Задавать autovacuum_naptime выше, ближе к первоначальному значению в одну минуту.

Восстановить autovacuum_max_workers до 3, если у вас много баз данных или много таблиц.

То, что вы должны сделать, чтобы сделать автовакуумный финиш как можно быстрее (что является целью), это установить autovacuum_vacuum_cost_delay до 0.

Если у вас есть только несколько очень занятых таблиц, лучше установить их на те таблицы, которые вы видите в своем вопросе.

Другие вопросы по тегам