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

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

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

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

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

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

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

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

Примечание

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

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

Расширение pgpro_rp включено в состав Postgres Pro Enterprise как стандартное расширение, но поскольку pgpro_rp использует разделяемую память для кеширования параметров приоритизации пользователей, его необходимо устанавливать отдельно. Установив pgpro_rp, выполните следующие действия, чтобы подготовить pgpro_rp к работе:

  1. Добавьте pgpro_rp в параметр shared_preload_libraries в файле postgresql.conf:

                  shared_preload_libraries = 'pgpro_rp'
                
  2. Перезапустите Postgres Pro Enterprise, чтобы изменения вступили в силу.

  3. Создайте расширение pgpro_rp:

                  CREATE EXTENSION pgpro_rp;
                

F.49.2. Использование #

Расширение pgpro_rp поддерживает следующие режимы работы:

F.49.2.1. Режим постоянных планов #

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

Использование этого режима включает следующие шаги:

  • Создание набора планов приоритизации ресурсов с помощью функции pgpro_rp_create_plan.

  • Назначение созданных планов пользователям или ролям с помощью функции pgpro_rp_create_role_plan.

Созданные планы можно изменять и удалять при необходимости.

Пример:

        -- Создание планов приоритизации ресурсов
        SELECT pgpro_rp_create_plan('plan_2_2_2', 2, 2, 2);
        SELECT pgpro_rp_create_plan('plan_8_8_8', '{ "session_cpu_weight":8,
        "session_ioread_weight":8, "session_iowrite_weight":8}');

        -- Назначение планов ролям
        SELECT pgpro_rp_create_role_plan('users', 'plan_2_2_2');
        SELECT pgpro_rp_create_role_plan('admins', 'plan_8_8_8');
      

F.49.2.2. Режим изменяемых планов #

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

Использование этого режима включает следующие шаги:

  • Создание набора планов приоритизации ресурсов с помощью функции pgpro_rp_create_plan.

  • Создание нескольких групп назначений планов пользователям/ролям с помощью функции pgpro_rp_create_group.

  • Добавление планов в группу назначений планов с помощью функции pgpro_rp_create_group_role_plan.

  • Назначение активной группы, когда это необходимо, с помощью функции pgpro_rp_set_active_group.

Пример:

        -- Создание планов приоритизации ресурсов
        SELECT pgpro_rp_create_plan('plan_8_8_8', 8, 8, 8);
        SELECT pgpro_rp_create_plan('plan_4_4_4', 4, 4, 4);
        SELECT pgpro_rp_create_plan('plan_2_2_2', 2, 2, 2);
        SELECT pgpro_rp_create_plan('plan_1_1_1', 1, 1, 1);

        -- Создание групп назначений планов пользователям/ролям и добавление в группы назначений планов
        SELECT pgpro_rp_create_group('day_plan');
        SELECT pgpro_rp_create_group_role_plan('day_plan', 'top', 'plan_4_4_4');
        SELECT pgpro_rp_create_group_role_plan('day_plan', 'main', 'plan_2_2_2');
        SELECT pgpro_rp_create_group_role_plan('day_plan', 'hr', 'plan_1_1_1');

        SELECT pgpro_rp_create_group('night_plan');
        SELECT pgpro_rp_create_group_role_plan('night_plan', 'top', 'plan_8_8_8');
        SELECT pgpro_rp_create_group_role_plan('night_plan', 'main', 'plan_1_1_1');
        SELECT pgpro_rp_create_group_role_plan('night_plan', 'hr', 'plan_2_2_2');

        -- Назначение активной группы
        CALL pgpro_rp_set_active_group('day_plan');
      

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

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

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

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

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

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

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

pgpro_rp_create_plan(a_plan_name text, a_plan_options jsonb) returns bigint
pgpro_rp_create_plan(a_plan_name text, a_cpu_weight int, a_ioread_weight int, a_iowrite_weight int) 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 #

Удаляет указанный план. Для вызова этой функции требуются права суперпользователя.

pgpro_rp_get_plan_id_by_name(a_plan_name text) returns bigint #

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

F.49.4.2. Функции групп назначений планов #

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

pgpro_rp_create_group(a_group_name text) returns bigint #

Создаёт группу назначений планов и возвращает её идентификатор. Для вызова этой функции требуются права суперпользователя.

pgpro_rp_rename_group(a_group_name text, a_new_group_name text) returns void #

Переименовывает указанную группу. Для вызова этой функции требуются права суперпользователя.

pgpro_rp_delete_group(a_group_name text) returns void #

Удаляет указанную группу. Для вызова этой функции требуются права суперпользователя.

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

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

Эти функции работают с активной группой назначений планов, которая задана в таблице pgpro_rp_options:

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_create_group_role_plan(a_group_name text, a_role_name text, a_plan_name text) returns void #

Добавляет указанный план в указанную группу. Для вызова этой функции требуются права суперпользователя.

pgpro_rp_delete_group_role_plan(a_group_name text, a_role_name text) returns void #

Удаляет план из указанной группы. Для вызова этой функции требуются права суперпользователя.

Прочие функции:

pgpro_rp_cleanup_roles_plans() returns void #

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

pgpro_rp_set_active_group(a_group_name text) returns void #

Делает активной группу назначений планов и очищает кеш параметров приоритизации. Для вызова этой функции требуются права суперпользователя.

pgpro_rp_get_active_group() returns text #

Возвращает идентификатор активной группы.

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

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

pgpro_rp_set_plan_selection_function(a_func_name text) returns void #

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

pgpro_rp_get_plan_selection_function() returns text #

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

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

pgpro_rp_backend_set_plan(a_pid int, a_plan_name text) returns void #

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

F.49.4.6. Функции кеша #

При создании сеанса происходит поиск назначенного пользователю/роли плана и применение к сеансу значений параметров приоритизации из найденного плана. Однако поиск плана требует определённых ресурсов (нужно прочитать данные из нескольких таблиц), поэтому предусмотрено кеширование значений параметров приоритизации пользователей в разделяемой памяти. При создании нового сеанса происходит поиск пользователя в кеше, и, если пользователь найден, применяются сохранённые в кеше значения параметров приоритизации. Поскольку значения в кеше могут устаревать, предусмотрена следующая функция очистки кеша:

pgpro_rp_invalidate_cache() returns void #

Очищает кеш параметров приоритизации в разделяемой памяти. Для вызова этой функции требуются права суперпользователя.

Эту функцию следует вызывать в случаях, когда могут измениться параметры приоритизации пользователей (назначение пользователям ролей, изменение параметров активной группы, использующихся планов и т. д.).

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

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

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

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

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

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

F.49.6. Пример #

В следующем примере показано использование 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)