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

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

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

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

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

autoprewarm_start_worker() RETURNS void

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

autoprewarm_dump_now() RETURNS int8

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

F.43.2. Параметры конфигурации #

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

F.43.3. Автор #

Robert Haas