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=sqlautoprewarm_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=sqlpg_size_pretty ---------------- 5096 kB (1 row)
-
загрузка данных в кеш базы данных. Результат показывает, что
pg_prewarm
делит данные на 637 блоков данных:SELECT pg_prewarm('test_pre','buffer');
Результат запроса:Раскрыть type=sqlpg_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 можно получить по ссылке.