24.2. Фоновая заморозка #
Когда устаревшие версии кортежей быстро накапливаются в таблицах баз данных и механизм автоматической очистки не справляется с нагрузкой, можно воспользоваться функциональностью Postgres Pro под названием фоновая заморозка. Это легковесный аналог автоочистки, который работает только с изменёнными и незаблокированными страницами данных постоянных таблиц, хранящихся в оперативной памяти. Фоновая заморозка быстро очищает страницы таблиц в оперативной памяти, что позволяет добавлять новые кортежи, замедляет увеличение таблиц и повышает эффективность автоочистки. Фоновую заморозку рекомендуется использовать для борьбы с раздуванием, при котором в таблицах появляется множество устаревших версий строк из-за многократных операций UPDATE. В частности, механизм помогает при раздувании, которое может возникать при добавлении строки со значениями NULL командой INSERT и дальнейшем многократном обновлении командой UPDATE, когда каждый раз обновляются разные столбцы этой строки.
Примечание
Если механизм автоочистки справляется с нагрузкой, пользоваться фоновой заморозкой не нужно.
24.2.1. Обзор #
Postgres Pro запускает выделенный рабочий процесс фоновой заморозки. Все обслуживающие процессы взаимодействуют с этим рабочим процессом через UDP-сокет, отправляя ему информацию о недавно изменённых страницах и завершённых транзакциях. Эта информация накапливается в специальных списках, которые есть у каждой таблицы. Когда количество изменённых страниц в списке превышает пороговое значение, установленное параметром bgfreezer_pages_per_rel_to_clean, список помещается в очередь на очистку и заморозку. Рабочий процесс начинает обработку этой очереди после того, как получит уведомление о завершении транзакции. В процессе очистки списка страниц рабочий процесс получает блокировку на чтение соответствующей таблицы. Это позволяет предотвращать параллельные операции, такие как удаление или усечение таблиц, которые могут выполняться в процессе работы фоновой заморозки. Для каждой страницы в списке механизм фоновой заморозки очищает и замораживает кортежи, соответствующие определённым условиям. За дополнительной информацией обратитесь к Подразделу 24.1.6. Если после очистки и заморозки все кортежи страницы видимы и заморожены и соответствующая страница карты видимости находится в памяти, механизм фоновой заморозки устанавливает биты видимости и заморозки на странице карты видимости. После очистки удалённых кортежей на странице данных корректируются данные карты свободного пространства (FSM). Без такой корректировки очищенные страницы не будут повторно использоваться.
Механизм фоновой заморозки работает только со страницами постоянных таблиц, временные таблицы не затрагиваются.
Фоновая заморозка помогает решать проблемы, которые могут возникать при частом создании и удалении большого количества временных таблиц. В таких случаях механизм автоочистки может очищать системные таблицы недостаточно быстро, что приводит к их раздуванию. Фоновая заморозка в основном применима к каталогам pg_type, pg_attribute, pg_class, pg_depend и pg_index. Она очищает удалённые кортежи в памяти, существенно уменьшая раздувание таблиц.
Чтобы включить фоновую заморозку, задайте значение on для параметра конфигурации enable_background_freezer.
Параметры конфигурации фоновой заморозки описаны в Разделе 19.11.
24.2. Background Freezer #
When obsolete tuple versions rapidly accumulate in database tables and autovacuum cannot keep up with the load, you can use the Postgres Pro feature called background freezer. It is a lightweight alternative to autovacuum that works only with modified and non-locked data pages of permanent tables stored in RAM. Background freezer rapidly vacuums table pages in RAM, which allows adding new tuples. This reduces table growth and improves autovacuum efficiency. Background freezer is recommended when dealing with table bloat where many outdated row versions appear in tables in case of multiple UPDATE operations. Specifically, it helps with bloating that may occur if a row is inserted with NULL values using INSERT and is then updated multiple times with UPDATE, each time modifying different columns of that row.
Note
You do not need to use background freezer if autovacuum can cope with the load.
24.2.1. Overview #
Postgres Pro launches a dedicated background freezer worker. All backends communicate with the worker using a UDP socket to send information about recently modified pages and completed transactions to this worker. This information is accumulated in special lists individual for each table. When the number of modified pages in the list exceeds the threshold set with the bgfreezer_pages_per_rel_to_clean configuration parameter, this list is queued for vacuuming and freezing. The worker starts processing this queue after being notified that the transaction has completed. While the list of pages is being vacuumed, the worker acquires a read lock on the corresponding table. This prevents parallel operations, such as dropping or truncating the table, during the background freezer activity. For each page of the list, the background freezer worker vacuums and freezes the tuples that meet the relevant conditions. For more information, see Section 24.1.6. If after vacuuming and freezing all page tuples are visible and frozen and the relevant visibility map page is in memory, background freezer sets the visibility and freezing bits on the visibility map page. After deleted tuples are vacummed on the data page, the free space map (FSM) data is also adjusted. Without such an adjustment, vacuumed pages will not be reused.
The background freezer mechanism only applies to permanent table pages, leaving temporary tables unaffected.
Background freezer helps with issues that may occur when a large number of temporary tables is frequently created and dropped. In such cases, autovacuum may not be fast enough to vacuum system tables causing them to bloat. This primarily applies to pg_type, pg_attribute, pg_class, pg_depend, and pg_index. Background freezer vacuums deleted tuples in memory, thereby considerably decreasing system table bloat.
To enable background freezer, set the enable_background_freezer configuration parameter to on.
To learn about the background freezer configuration parameters, see Section 19.11.