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

Формат:

autoprewarm_dump_now() 
  RETURNS int8

Входные параметры:

Отсутствуют.

Возвращаемое значение:

Возвращает число записей, внесенных в файл autoprewarm.blocks.

Пример:

SELECT autoprewarm_dump_now();

Результат выполнения запроса:

 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 EXTENSION pg_prewarm SCHEMA ext;

Настройка#

Настройка не требуется.

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

Создание тестовой таблицы:

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'));

Результат запроса:

 pg_size_pretty 
----------------
 5096 kB
(1 row)

Загрузка данных в кеш базы данных. Результат показывает, что pg_prewarm делит данные на 637 блоков данных:

SELECT pg_prewarm('test_pre','buffer');

Результат запроса:

 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
...

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

Исходная документация PosgreSQL по модулю pg_prewarm: https://www.postgresql.org/docs/15/pgprewarm.html