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