F.41. pg_prewarm — предварительная загрузка данных отношений в кеш буферов #
Модуль pg_prewarm
предоставляет удобную возможность загружать данные отношений в кеш операционной системы или в кеш буферов Postgres Pro. Предварительную загрузку можно выполнить вручную, вызвав функцию pg_prewarm
, или автоматически, добавив pg_prewarm
в shared_preload_libraries. Во втором случае система запустит фоновый процесс, который будет периодически записывать содержимое разделяемых буферов в файл autoprewarm.blocks
с тем, чтобы эти блоки подгружались в память при запуске сервера, используя два дополнительных фоновых процесса.
F.41.1. Функции #
pg_prewarm(regclass, mode text default 'buffer', fork text default 'main', first_block int8 default null, last_block int8 default null) RETURNS int8
Первый аргумент задаёт отношение, которое будет «разогрето». Во втором указывается метод «разогрева», из описанных ниже; в третьем задаётся целевой слой отношения, обычно main
. В четвёртом аргументе можно передать номер первого разогреваемого блока (NULL
принимается как синоним нуля), а в пятом — номер последнего блока (NULL
означает последний блок отношения). Возвращает эта функция количество разогретых блоков.
Эта функция поддерживает три режима разогрева. В режиме prefetch
выдаются асинхронные запросы предвыборки данных операционной системе, если они поддерживаются, либо происходит ошибка. В режиме read
считывается заданный диапазон блоков; в отличие от prefetch
это происходит синхронно и поддерживается во всех ОС и любыми сборками, но может быть медленнее. В режиме buffer
запрошенный диапазон блоков считывается в кеш буферов базы данных.
Заметьте, что с любым из этих методов попытка разогреть больше блоков, чем может уместиться в кеше (в кеше ОС в режимах prefetch
и read
, либо в кеше Postgres Pro в режиме buffer
) скорее всего приведёт к тому, что блоки с меньшими номерами будут вытеснены из кеша при чтении последующих блоков. Кроме того, разогретые данные никаким специальным образом не защищаются от вытеснения из кеша, так что возможна ситуация, когда из-за другой активности только что разогретые блоки будут вытеснены вскоре после чтения; с другой стороны при таком разогреве из кеша могут быть вытеснены другие данные. Поэтому разогрев обычно наиболее полезен при загрузке, когда кеши в основном пусты.
autoprewarm_start_worker() RETURNS void
Запустить основной рабочий процесс авторазогрева. Обычно он запускается автоматически, но эта функция полезна, если автоматический разогрев не был настроен при запуске сервера и вы хотите запустить этот процесс позже.
autoprewarm_dump_now() RETURNS int8
Обновить autoprewarm.blocks
немедленно. Это может быть полезно, если рабочий процесс авторазогрева не работает, но вы хотите, чтобы авторазогрев был произведён при перезапуске. Эта функция возвращает число записей, внесённых в autoprewarm.blocks
.
F.41.2. Параметры конфигурации #
Эти параметры должны задаваться в postgresql.conf
. Обычное использование выглядит так:
# postgresql.conf shared_preload_libraries = 'pg_prewarm' pg_prewarm.autoprewarm = true pg_prewarm.autoprewarm_interval = 300s
F.41.3. Автор #
Роберт Хаас <rhaas@postgresql.org>