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

pg_prewarm — предзагрузка данных отношений в буферный кеш

примечание

Эта страница переведена при помощи нейросети GigaChat.

Модуль pg_prewarm предоставляет удобный способ загрузки данных отношения либо в кеш буфера операционной системы, либо в кеш буфера PostgreSQL. Предварительный прогрев можно выполнить вручную с помощью функции pg_prewarm, или автоматически, включив pg_prewarm в shared_preload_libraries. В последнем случае система запустит фоновый рабочий процесс, который периодически записывает содержимое общих буферов в файл под названием autoprewarm.blocks и будет использовать два фоновых рабочих процесса для повторной загрузки тех же блоков после перезапуска.

Функции

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, или PostgreSQL при использовании buffer вероятно приведет к вытеснению блоков с меньшими номерами по мере чтения блоков с большими номерами. Предварительно прогретые данные не имеют специальной защиты от вытеснения из кеша, поэтому возможно, что другая системная активность вытеснит только что предварительно прогретые блоки вскоре после их чтения; наоборот, предварительный прогрев также может вытеснить другие данные из кеша. По этим причинам предварительный прогрев обычно наиболее полезен при запуске, когда кеши в значительной степени пусты.

autoprewarm_start_worker() RETURNS void

Запустить основного рабочего процесса автоматического предварительного прогрева. Это обычно происходит автоматически, но полезно, если автоматический прогрев не был настроен во время запуска сервера, и нужно запустить рабочий процесс позже.

autoprewarm_dump_now() RETURNS int8

Обновить autoprewarm.blocks немедленно. Это может быть полезно, если рабочий процесс автоматического прогрева не запущен, но ожидается его запуск после следующего перезапуска. Возвращаемое значение – количество записей, записанных в autoprewarm.blocks.

Параметры конфигурации

pg_prewarm.autoprewarm (boolean)

: Управляет тем, должен ли сервер запускать рабочий процесс автоподогрева. Это включено по умолчанию. Параметр можно установить только при запуске сервера.

pg_prewarm.autoprewarm_interval (integer)

: Это интервал между обновлениями autoprewarm.blocks. По умолчанию – 300 секунд. Если установлено значение 0, файл не будет сбрасываться через регулярные интервалы, а только при выключении сервера.

Эти параметры должны быть установлены в postgresql.conf. Типичное использование может быть следующим:

# postgresql.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s