F.51. pgpro_rp — приоритизация ресурсов #

pgpro_rp — это расширение Postgres Pro Enterprise для приоритизации ресурсов.

В системах с ограниченными ресурсами или с большой нагрузкой может потребоваться устанавливать приоритет выполнения транзакций, чтобы некоторые транзакции выполнялись быстрее, чем другие. Например, может потребоваться выполнять простые пользовательские запросы как можно быстрее, даже если это задерживает менее срочные задачи, такие как сложные запросы OLAP, которые могут выполняться одновременно. Postgres Pro Enterprise позволяет назначать план приоритизации ресурсов для определённого сеанса, что может замедлять работу этого сеанса в зависимости от количества процессоров, операций чтения и записи, ресурсов, которые этот сеанс потребляет по сравнению с другими сеансами. Эти параметры могут принимать значения веса 1, 2, 4 и 8. Чем выше значение, тем больше ресурсов может использовать сеанс. По умолчанию все сеансы имеют вес 4 для всех типов ресурсов. План приоритизации ресурсов содержит набор этих параметров приоритизации в формате jsonb и может быть назначен любому пользователю или роли.

План выбирается во время создания сеанса с использованием событийного триггера входа следующим образом:

  • Сначала pgpro_rp вызывает функцию выбора плана, если она установлена. В противном случае выполняется поиск плана, назначенного текущему пользователю.

  • Если пользователю не назначен план, pgpro_rp выбирает план с максимальной суммой приоритетов среди планов, назначенных ролям, членом которых является пользователь.

  • Наконец, применяются параметры приоритизации найденного плана.

Если определить план невозможно, применяются параметры приоритизации по умолчанию: все приоритеты имеют значение 4.

Примечание

Управлять планами и изменять их могут только суперпользователи.

F.51.1. Установка #

Расширение pgpro_rp включено в состав Postgres Pro Enterprise как стандартное расширение. После установки Postgres Pro Enterprise выполните команду CREATE EXTENSION, чтобы включить pgpro_rp, как указано ниже:

CREATE EXTENSION pgpro_rp;

F.51.2. Представление pgpro_rp_roles_plans_view #

Все роли и назначенные им планы доступны в представлении с именем pgpro_rp_roles_plans_view. Это представление содержит одну строку для каждой роли с назначенным планом. Столбцы представления показаны в Таблице F.108.

Таблица F.108. Столбцы pgpro_rp_roles_plans_view

ИмяТипОписание
rolnametextИмя пользователя/роли
plan_nametextПлан, используемый для пользователя/роли

F.51.3. Функции #

F.51.3.1. Функции управления планами #

Функции, описанные в этом разделе, позволяют создавать, изменять или удалять планы приоритизации ресурсов.

pgpro_rp_create_plan(a_plan_name text, a_plan_options jsonb) returns bigint #

Создаёт план с заданным именем и параметрами и возвращает его идентификатор.

pgpro_rp_rename_plan(a_plan_name_old text, a_plan_name_new text) returns void #

Переименовывает указанный план.

pgpro_rp_update_plan(a_plan_name text, a_plan_options jsonb) returns void #

Изменяет параметры указанного плана.

pgpro_rp_delete_plan(a_plan_name text) returns void #

Удаляет указанный план.

F.51.3.2. Функции назначения планов #

Функции, описанные в этом разделе, позволяют управлять назначением планов для ролей.

pgpro_rp_create_role_plan(a_role_name text, a_plan_name text) returns void #

Назначает план по умолчанию для указанной роли.

pgpro_rp_update_role_plan(a_role_name text, a_plan_name text) returns void #

Изменяет план по умолчанию для указанной роли.

pgpro_rp_delete_role_plan(a_role_name text) returns void #

Удаляет план, назначенный указанной роли.

pgpro_rp_cleanup_roles_plans() returns void #

Удаляет из таблицы pgpro_rp_roles_plans планы, назначенные несуществующим ролям.

F.51.3.3. Функции выбора планов #

Для выбора планов приоритизации ресурсов можно объявить пользовательскую функцию, используя указанные ниже функции. Эта функция будет вызываться в начале сеанса, не принимает аргументов и возвращает идентификатор плана.

pgpro_rp_set_plan_selection_function(a_func_name text) returns void #

Устанавливает функцию выбора плана. Если передан NULL, текущая функция сбрасывается.

pgpro_rp_get_plan_selection_function() returns text #

Возвращает функцию выбора текущего плана.

F.51.3.4. Функция назначения плана для обслуживающего процесса #

pgpro_rp_backend_set_plan(a_pid int, a_plan_name text) returns void #

Ищет план с заданным именем и применяет его параметры к обслуживающему процессу с указанным PID.

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

При необходимости можно также управлять приоритетами вручную:

  • Настроить интервал времени для сбора статистики использования всех активных обслуживающих процессов, задав параметр usage_tracking_interval в postgresql.conf. Не рекомендуется задавать для usage_tracking_interval маленькие значения, так как частый сбор статистики может привести к издержкам.

  • В зависимости от того, использованием каких ресурсов вы хотите управлять, изменить следующие параметры для сеансов, которые необходимо приоритизировать:

    Сеансы с равным весом имеют одинаковые приоритеты при использовании ресурсов, поэтому если вы назначите всем сеансам какое угодно, но одно и то же значение, это никак не повлияет на производительность. По умолчанию все сеансы имеют вес 4 для всех типов ресурсов.

    Все возможные способы изменения конфигурации для конкретного сеанса описаны в Разделе 19.1.

F.51.5. Пример #

В следующем примере показано использование pgpro-rp.

CREATE EXTENSION pgpro_rp;
CREATE USER test_user;
SELECT pgpro_rp_create_plan(
 'test_plan',
 '{ "session_cpu_weight":8, "session_ioread_weight":8, "session_iowrite_weight":8 }'
);
SELECT pgpro_rp_create_role_plan('test_user', 'test_plan');

При следующем входе пользователя test_user параметры приоритизации будут выглядеть следующим образом:

SHOW session_cpu_weight;
 session_cpu_weight
--------------------
 8
(1 row)
SHOW session_ioread_weight;
 session_ioread_weight
-----------------------
 8
(1 row)
SHOW session_iowrite_weight;
 session_iowrite_weight
------------------------
 8
(1 row)