Postgresql autovacuum не работает, хотя процесс запущен

У меня есть PostgreSQL 9.2, работающий на Ubuntu. На сервере запущен процесс автоочистки.

База данных сильно загружена, 1000 добавлений и 100 удалений ежедневно, и все же кажется, что автоочистка не запускается.

В логах нет ничего, что касалось бы вакуума.

Делаю ps -ef | grep -i vacuum

производит: postgres 1406 1130 0 Oct13 00:00:14 postgres: autovacuum launcher process

Выполнение запроса SELECT last_autovacuum , last_autoanalyze FROM pg_stat_user_tables; не создает записей в последнем столбце автоочистки и 2 записей в столбце suto_analyze.

Соответствующий раздел postgresql.conf:

#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------

autovacuum = on         # Enable autovacuum subprocess?  'on'
                    # requires track_counts to also be on.
log_autovacuum_min_duration = 250   # -1 disables, 0 logs all actions and
                    # their durations, > 0 logs only
                    # actions running at least this number
                    # of milliseconds.
autovacuum_max_workers = 3      # max number of autovacuum subprocesses
                    # (change requires restart)
#autovacuum_naptime = 1min      # time between autovacuum runs
autovacuum_vacuum_threshold = 128   # min number of row updates before
                    # vacuum
autovacuum_analyze_threshold = 128  # min number of row updates before
                    # analyze
#autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
                    # (change requires restart)
#autovacuum_vacuum_cost_delay = 20ms    # default vacuum cost delay for
                    # autovacuum, in milliseconds;
                    # -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1  # default vacuum cost limit for
                    # autovacuum, -1 means use
                    # vacuum_cost_limit

Какие-нибудь мысли?


person user1448820    schedule 22.10.2013    source источник
comment
См. postgresql.org/docs/9.2/static/monitoring-stats.html. last_autovacuum — время последней очистки этой таблицы демоном автоочистки. Я предполагаю, что это timetemp завершения автовакуума. Просто, если демон производит высокую нагрузку, он в любом случае не может работать. Попробуйте запустить очистку из командной строки как команду SQL, чтобы узнать, как долго выполняется очистка каждой таблицы.   -  person Martin Strejc    schedule 23.10.2013
comment
1000 добавлений и 100 удалений — это не так уж и много. У вас есть навороты в таблицах? Предлагает ли n_dead_tup очистку любых таблиц? Возможно, вам просто не нужно часто пылесосить. Установка log_autovacuum_min_duration=0 должна записывать в журналы больше данных, хотя, возможно, недостаточно, чтобы доказать вам, что это работает хорошо. Что такое suto_analyze?   -  person jjanes    schedule 23.10.2013


Ответы (1)


Соответствующая запись в цитируемой конфигурации, вероятно, следующая:

autovacuum_vacuum_scale_factor = 0,2

При этом значении по умолчанию автоочистка пропускает таблицу, если менее 20% ее строк было удалено или обновлено (или менее autovacuum_vacuum_threshold строк, но при 128, здесь это не имеет значения).

См. его определение в документации:

autovacuum_vacuum_scale_factor (с плавающей запятой)

Указывает часть размера таблицы, которую нужно добавить к autovacuum_vacuum_threshold при принятии решения о том, запускать ли VACUUM. По умолчанию 0,2 (20% от размера таблицы). Этот параметр можно задать только в файле postgresql.conf или в командной строке сервера. Этот параметр можно переопределить для отдельных таблиц, изменив параметры хранения.

Чтобы автоочистка обрабатывала определенные таблицы, если вам не нравятся значения по умолчанию, вы можете уменьшить этот параметр в каждом конкретном случае. Например, чтобы установить его на 1%:

ALTER TABLE tablename SET (autovacuum_vacuum_scale_factor=0.01);
person Daniel Vérité    schedule 24.10.2013