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.
Если у вас есть только несколько очень занятых таблиц, лучше установить их на те таблицы, которые вы видите в своем вопросе.