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