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

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


Функции

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

autoprewarm_start_worker() RETURNS void

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

autoprewarm_dump_now() RETURNS int8

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


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

pg_prewarm.autoprewarm (boolean)
Определяет, должен ли сервер запускать рабочий процесс автозагрузки. По умолчанию от включен. Этот параметр можно задать только при запуске сервера.

pg_prewarm.autoprewarm_interval (int)
Это интервал между обновлениями файла autoprewarm.blocks. Значение по умолчанию — 300 секунд. При значении 0 файл будет сохраняться не периодически, а только при отключении сервера.

Эти параметры нужно установить в qhb.conf. Их обычное использование может выглядеть так:

# qhb.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

Автор

Роберт Хаас (Robert Haas), rhaas@postgresql.org