Рекомендации по настройке для Autovacuum - PullRequest
0 голосов
/ 04 мая 2020

Демон AUTOVACUUM состоит из нескольких процессов, которые восстанавливают хранилище, удаляя устаревшие данные или кортежи из базы данных. Он проверяет таблицы, в которых имеется значительное количество вставленных, обновленных или удаленных записей, и пылесосит эти таблицы на основе параметров конфигурации

  1. . Вы можете определить, требуется ли очистка таблицы в вашей базе данных с помощью запустив следующий запрос:

    ВЫБЕРИТЕ имя данных, возраст (datfrozenxid) ОТ базы данных pg ORDER BY age (datfrozenxid) des c limit 20;

  2. Пока вы подключены к Ваша база данных, выполнив следующий запрос, поможет увидеть список таблиц, которые автоочистка считает пригодными для очистки:

              WITH vbt AS (SELECT setting AS autovacuum_vacuum_threshold FROM 
            pg_settings WHERE name = 'autovacuum_vacuum_threshold')
                , vsf AS (SELECT setting AS autovacuum_vacuum_scale_factor FROM 
            pg_settings WHERE name = 'autovacuum_vacuum_scale_factor')
                , fma AS (SELECT setting AS autovacuum_freeze_max_age FROM 
            pg_settings WHERE name = 'autovacuum_freeze_max_age')
                , sto AS (select opt_oid, split_part(setting, '=', 1) as param, 
            split_part(setting, '=', 2) as value from (select oid opt_oid, 
            unnest(reloptions) setting from pg_class) opt)
            SELECT
                '"'||ns.nspname||'"."'||c.relname||'"' as relation
                , pg_size_pretty(pg_table_size(c.oid)) as table_size
                , age(relfrozenxid) as xid_age
                , coalesce(cfma.value::float, autovacuum_freeze_max_age::float) 
            autovacuum_freeze_max_age
                , (coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) 
            + coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * 
            c.reltuples) as autovacuum_vacuum_tuples
                , n_dead_tup as dead_tuples
            FROM pg_class c join pg_namespace ns on ns.oid = c.relnamespace
            join pg_stat_all_tables stat on stat.relid = c.oid
            join vbt on (1=1) join vsf on (1=1) join fma on (1=1)
            left join sto cvbt on cvbt.param = 'autovacuum_vacuum_threshold' and 
            c.oid = cvbt.opt_oid
            left join sto cvsf on cvsf.param = 'autovacuum_vacuum_scale_factor' and 
            c.oid = cvsf.opt_oid
            left join sto cfma on cfma.param = 'autovacuum_freeze_max_age' and 
            c.oid = cfma.opt_oid
            WHERE c.relkind = 'r' and nspname <> 'pg_catalog'
            and (
                age(relfrozenxid) >= coalesce(cfma.value::float, 
            autovacuum_freeze_max_age::float)
                or
                coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) + 
            coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * 
            c.reltuples <= n_dead_tup
               -- or 1 = 1
            )
            ORDER BY age(relfrozenxid) DESC LIMIT 50;
    
  3. Некоторые параметры влияют на поведение автоочистки и выполняют следующий запрос. показывает значения некоторых параметров, которые непосредственно влияют на автовакуум и его поведение:

            SELECT name, setting, unit, short_desc
            FROM pg_settings
            WHERE name IN (
            'autovacuum_max_workers',
            'autovacuum_analyze_scale_factor',
            'autovacuum_naptime',
            'autovacuum_analyze_threshold',
            'autovacuum_analyze_scale_factor',
            'autovacuum_vacuum_threshold',
            'autovacuum_vacuum_scale_factor',
            'autovacuum_vacuum_threshold',
            'autovacuum_vacuum_cost_delay',
            'autovacuum_vacuum_cost_limit',
            'vacuum_cost_limit',
            'autovacuum_freeze_max_age',
            'maintenance_work_mem',
            'vacuum_freeze_min_age');
    

Хотя все они влияют на автовакуум, некоторые из наиболее важных из них:

            maintenance_mork_mem
            autovacuum_freeze_max_age
            autovacuum_max_workers
            autovacuum_vacuum_cost_delay
            Autovacuum_vacuum_cost_limit

Ниже приведено определение / объяснение некоторых из этих важных параметров:

Autovacuum_freeze_max_age Spec ifies максимальный возраст (в транзакциях), которого может достичь поле pg_class.relfrozenxid таблицы, прежде чем операция VACUUM будет вынуждена предотвратить обход идентификатора транзакции в таблице. Обратите внимание, что система будет запускать процессы автоочистки, чтобы предотвратить циклическое изменение, даже если автовакуум отключен.

autovacuum_max_workers (integer) Этот параметр указывает максимальное количество процессов автоочистки, которые могут выполняться в любой момент времени, поскольку очистка не происходят в одном процессе автовакуума. По умолчанию используется три (3).

autovacuum_vacuum_cost_limit Этот параметр указывает предельное значение стоимости, которое будет использоваться в автоматических операциях c VACUUM. Если указано значение -1 (которое используется по умолчанию), будет использоваться обычное значениеuum_cost_limit. Обратите внимание, что это значение распределяется пропорционально между работающими работниками автоочистки, если их больше одного, так что сумма пределов для каждого работника не превышает значения этой переменной.

autovacuum_vacuum_cost_delay Этот параметр указывает значение задержки стоимости, которое будет использоваться в автоматических c операциях VACUUM. Если указано -1, будет использоваться обычное значение вакуума_коста. Значение по умолчанию составляет 20 миллисекунд.

autovacuum_vacuum_scale_factor Этот параметр указывает, как часто срабатывает автовакуум. Если вы хотите, чтобы автоочистка запускалась чаще, я рекомендую использовать небольшое значение для autovacuum_vacuum_scale_factor (например, 0,02 или 0,01). Чем меньше значение этого параметра, тем меньше число мертвых кортежей, с которыми каждый раз будет работать автоочистка. Для больших таблиц это означает, что для автоматического вакуума может потребоваться меньше времени на ввод-вывод и меньше времени для завершения sh.

Примечание. Для небольших столов может возникнуть проблема, связанная с тем, что автоматический вакуум запускается излишне часто и приводит к накладным расходам. Если ваши таблицы имеют разные размеры или разные шаблоны записи, я рекомендую установить для этого параметра разные значения на уровне таблицы, а не одно значение на уровне базы данных. Для более подробного определения параметров автовакуума, пожалуйста, просмотрите этот документ [2]

[1] Автовакуумная настройка - https://www.2ndquadrant.com/en/blog/autovacuum-tuning-basics/ [2] Дальнейшее определение опции автовакуума - https://www.postgresql.org/docs/9.6/runtime-config-autovacuum.html#GUC - автовакуумный-MAX-РАБОТНИКИ

...