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