pg_prewarm

Прогрев путем загрузки данных отношений в кеш.
Схема размещения: ext.
Модуль pg_prewarm предоставляет удобную возможность загрузки данных отношений в кеш операционной системы или в кеш буферов PostgreSQL. Предварительную загрузку можно производить вручную с использованием функции pg_prewarm или автоматически, добавив pg_prewarm в параметр shared_preload_libraries. Во втором случае система запустит фоновый процесс, который будет регулярно записывать содержимое разделяемых буферов в файл autoprewarm.blocks, чтобы эти блоки подгружались в память при запуске сервера, применяя два дополнительных фоновых процесса.
По умолчанию файл autoprewarm.blocks формируется в каталоге $PGDATA.
Функции:
  • pg_prewarm (вызвать предварительную загрузку вручную).
    pg_prewarm(
      regclass,
      mode              TEXT  DEFAULT 'buffer',
      fork              TEXT  DEFAULT 'main',
      first_block       INT8  DEFAULT null,
      last_block        INT8  DEFAULT null
    ) RETURNS INT8
    
    Входные параметры:
    • regclass — отношение, которое будет «разогрето»;
    • mode — метод «разогрева»:
      • prefetch – в этом режиме операционной системе (ОС) выдаются асинхронные запросы предвыборки данных, если они поддерживаются, иначе происходит ошибка;
      • read – в этом режиме считывается заданный диапазон блоков; считывание происходит синхронно и поддерживается во всех ОС любыми сборками; может выполняться медленнее prefetch и buffer;
      • buffer – в этом режиме запрошенный диапазон блоков считывается в кеш буферов базы данных;
    • fork — целевой слой отношения, обычно main;
    • first_block — номер первого разогреваемого блока (NULL = синоним нуля);
    • last_block – номер последнего разогреваемого блока (NULL означает последний блок отношения).
    Возвращаемое значение: возвращает количество разогретых блоков.
    Пример:
    SELECT pg_prewarm('test_ralation','buffer');
  • autoprewarm_start_worker (запустить основной рабочий процесс авторазогрева). Обычно он запускается автоматически, но эта функция полезна, если автоматический разогрев не был настроен при запуске сервера, а вы хотите запустить этот процесс позже.
    autoprewarm_start_worker()
      RETURNS void
    
    Входные параметры: отсутствуют.
    Возвращаемое значение: отсутствует.
    Пример:
    SELECT autoprewarm_start_worker();
  • autoprewarm_dump_now (обновить файл autoprewarm.blocks немедленно). Это может быть полезно, если рабочий процесс авторазогрева не работает, но вы хотите, чтобы авторазогрев был произведен при перезапуске.
    autoprewarm_dump_now()
      RETURNS int8
    
    Входные параметры: отсутствуют.
    Возвращаемое значение: возвращает число записей, внесенных в файл autoprewarm.blocks.
    Пример:
    SELECT autoprewarm_dump_now();
    Результат выполнения запроса:
    Раскрыть type=sql
     autoprewarm_dump_now
    ----------------------
                     1918
    (1 row)
    
Параметры конфигурации должны задаваться в конфигурации СУБД.
ПараметрЗначениеОписание
pg_prewarm.autoprewarm
booleanУказывает, должен ли сервер запускать рабочий процесс авторазогрева; задать можно только при запуске сервера; по умолчанию он включен – true
pg_prewarm.autoprewarm_interval
intЗадает интервал между обновлениями файла autoprewarm.blocks. Значение по умолчанию — 300 сек. При значении, равном 0, файл будет сохраняться не периодически, а только при отключении сервера
Пример конфигурации:
shared_preload_libraries = 'pg_prewarm'
pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

Ограничения

С любым из методов разогрева попытка обработать больше блоков, чем может уместиться в кеше ОС в режимах prefetch и read, либо в кеше PostgreSQL в режиме buffer, может привести к тому, что блоки с меньшими номерами будут вытеснены из кеша при чтении последующих блоков. Разогретые данные не защищаются от вытеснения из кеша, поэтому из-за другой активности только что разогретые блоки могут быть вытеснены вскоре после чтения. С другой стороны, при таком разогреве из кеша могут быть вытеснены другие данные, поэтому разогрев обычно наиболее полезен при загрузке, когда кеши в основном пусты.

Использование модуля

Примеры использования модуля:
  • создание тестовой таблицы:
    CREATE TABLE test_pre (
              id int4,
              name character varying(64),
              creat_time timestamp(6) without time zone
              );
    
  • наполнение тестовой таблицы данными:
    INSERT INTO test_pre
            SELECT generate_series(1,100000),
                   generate_series(1,100000)||  '_pre',clock_timestamp();
    
  • определение размера таблицы:
    SELECT pg_size_pretty (pg_relation_size('test_pre'));
    Результат запроса:
    Раскрыть type=sql
     pg_size_pretty
    ----------------
     5096 kB
    (1 row)
    
  • загрузка данных в кеш базы данных. Результат показывает, что pg_prewarm делит данные на 637 блоков данных:
    SELECT pg_prewarm('test_pre','buffer');
    Результат запроса:
    Раскрыть type=sql
     pg_prewarm
    ------------
            637
    (1 row)
    
  • проверка размера блока. Размер блока = 8 kB (значение по умолчанию):
    SELECT current_setting('block_size');
     current_setting
    -----------------
     8192
    (1 row)
    
  • проверка полноты загрузки вычислением – количество блоков, занятых таблицей, умножить на размер блока:
    637 * 8 kB = 5096 kB
  • обновление данных в файле autoprewarm.blocks:
    SELECT autoprewarm_dump_now();
     autoprewarm_dump_now
    ----------------------
                     1918
    (1 row)
    
  • проверка содержимого файла $PGDATA/autoprewarm.blocks – количество строк = 1918:
    <<1918>>
    0,1664,1260,0,0
    0,1664,7113,0,0
    0,1664,1261,0,0
    0,1664,7112,0,0
    0,1664,1262,0,0
    ...
    

Ссылки на документацию разработчика

Дополнительную информацию по поставляемому модулю pg_prewarm можно получить по ссылке.
Предыдущий раздел
pg_outline
Следующий раздел
pg_profile
Была ли страница полезной?