Перейти к основному содержимому

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.autoprewarmbooleanУказывает, должен ли сервер запускать рабочий процесс авторазогрева; задать можно только при запуске сервера; по умолчанию он включен – true
pg_prewarm.autoprewarm_intervalintЗадает интервал между обновлениями файла 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