[Документация Yandex Cloud](../../index.md) > [Yandex MPP Analytics for PostgreSQL](../index.md) > [Концепции](overview.md) > Ресурсные группы

# Ресурсные группы

Ресурсные группы позволяют пользователям с [ролью](cluster-users.md#mdb_admin) `mdb_admin` устанавливать квоты на выделяемые для обработки запросов ресурсы:

* вычислительные ресурсы CPU;
* объем оперативной памяти;
* количество одновременных транзакций.

В ресурсную группу может входить несколько [ролей](cluster-users.md), квоты для них будут общими.


Yandex MPP Analytics for PostgreSQL получает от пользователя запрос на транзакцию и сопоставляет необходимые для ее выполнения ресурсы со свободными квотами в ресурсной группе. Если квот достаточно, выполнение запроса начинается немедленно. Если квот не хватает, запрос ожидает, пока выполнение других запросов не будет завершено и ресурсы не освободятся. Очередь запросов устроена по принципу «первый вошел — первый обслужен».

В кластерах с СУБД Apache Cloudberry™ и Greenplum® [параметры ресурсных групп](#parameters), ресурсные группы [по умолчанию](#default) и подход к [распределению оперативной памяти](#ram) различаются.

О том, как управлять ресурсными группами, читайте в [соответствующем разделе](../operations/resource-groups.md).


## Параметры ресурсных групп {#parameters}

{% list tabs group=instructions %}

- Apache Cloudberry™ {#cb}

  #|
  || **Название** | **Описание** ||
  || `CONCURRENCY` | Максимальное количество транзакций, обрабатываемых в ресурсной группе одновременно. Включает в себя активные транзакции и транзакции в режиме ожидания. Минимальное значение — `0` (транзакции не обрабатываются), максимальное значение берется из настройки [max_connections](settings-list.md#setting-max-connections), по умолчанию — `20` ||
  || `CPU_MAX_PERCENT` | Максимальный процент CPU, который может использовать ресурсная группа на сегменте. Минимальное значение — `1`, максимальное значение — `100`, по умолчанию — `-1` (не задано). При заданном `CPU_MAX_PERCENT` параметр `CPUSET` игнорируется.
  
  Подробнее в разделе [Особенности распределения ресурсов CPU](#cpu) ||
  || `CPU_WEIGHT` | Приоритет ресурсной группы при распределении CPU. Минимальное значение — `1`, максимальное значение — `500`, по умолчанию — `100` ||
  || `CPUSET` | Номера логических ядер CPU, зарезервированных за ресурсной группой. Задается для [мастера и сегментов](index.md) в виде отдельных значений или диапазонов. По умолчанию — `-1` (не заданы). При заданном `CPU_MAX_PERCENT` параметр `CPUSET` игнорируется.
  
  > Например, чтобы зарезервировать для мастера ядро `1`, а для сегментов `1`, `3`, `4`, укажите `CPUSET='1;1,3-4'`.
  
  {% note warning %}

  Для стабильной работы кластера не резервируйте ядро с номером `0`.

  {% endnote %}
  ||
  || `IO_LIMIT` | Максимальная пропускная способность при чтении и записи, а также максимальное количество операций чтения и записи в секунду для ресурсной группы. Задается для каждого табличного пространства отдельно:
  
  * `wbps` — максимальная пропускная способность при записи (МБ/с);
  * `rbps` — максимальная пропускная способность при чтении (МБ/с);
  * `wiops` — максимальное количество операций записи в секунду;
  * `riops` — максимальное количество операций чтения в секунду.

  Для каждого параметра `IO_LIMIT` минимальное значение — `2`, максимальное значение — `4294967295`, по умолчанию — `-1` (не ограничено). Можно указывать не все параметры. Для параметров, которые не были указаны, используются значения по умолчанию.
  
  > Например: `IO_LIMIT='pg_default:wbps=1000,rbps=1000,wiops=100,riops=100'` ||
  || `MEMORY_QUOTA` | Объем оперативной памяти (в мегабайтах), который может использовать ресурсная группа на сегменте. По умолчанию — `-1` (не ограничено), и будет использована настройка [statement_mem](settings-list.md#setting-statement-mem).
  
  Подробнее в разделе [Особенности распределения оперативной памяти](#ram) ||
  || `MIN_COST` | Минимальная стоимость плана запроса, при которой запрос назначается ресурсной группе. По умолчанию — `0` ||
  |#

- Greenplum® {#gp}

  #|
  || **Название** | **Описание** ||
  || `MEMORY_AUDITOR` | Средство контроля памяти, используемое ресурсной группой. В Yandex MPP Analytics for PostgreSQL по умолчанию используется значение `vmtracker` ||
  || `CONCURRENCY` | Максимальное количество транзакций, обрабатываемых в ресурсной группе одновременно. Включает в себя активные транзакции и транзакции в режиме ожидания. Значение по умолчанию — `20` ||
  || `CPU_RATE_LIMIT` | Процент CPU, который может использовать ресурсная группа на сегменте. Минимальное значение — `1`, максимальное значение — `100`. Автоматически сбрасывается на `-1`, если задан параметр `CPUSET` ||
  || `CPUSET` | Зарезервированные номера ядер CPU. Номера или интервалы задаются в кавычках, например: `'1,3-4'`. Указанные номера должны существовать в системе и не могут совпадать с номерами, зарезервированными для других ресурсных групп. Автоматически сбрасывается на `-1`, если задан параметр `CPU_RATE_LIMIT`.
  
  {% note warning %}

  Для стабильной работы кластера не резервируйте ядро с номером `0`.

  {% endnote %}
  ||
  || `MEMORY_LIMIT` | Процент оперативной памяти, который может использовать ресурсная группа на сегменте. Минимальное значение — `0` (по умолчанию), максимальное значение — `100`. При значении `0` ресурсная группа сможет использовать только [незарезервированную память](#ram) для выполнения запросов. Сумма значений `MEMORY_LIMIT` всех ресурсных групп не должна превышать `100` ||
  || `MEMORY_SHARED_QUOTA` | Процент от зарезервированной памяти `MEMORY_LIMIT`, который может использоваться всеми транзакциями ресурсной группы по мере необходимости.
  
  Подробнее в разделе [Особенности распределения оперативной памяти](#ram) ||
  || `MEMORY_SPILL_RATIO` | Порог использования оперативной памяти для транзакции в процентах от зарезервированной памяти `MEMORY_LIMIT`. Если это значение превышено, то для обработки транзакции создаются временные файлы на диске. Минимальное значение — `0` (по умолчанию), максимальное значение — `100`. Если `MEMORY_LIMIT` равно `0`, то значение этого параметра также должно быть равно `0` ||
  |#

{% endlist %}


## Ресурсные группы по умолчанию {#default}

{% list tabs group=instructions %}

- Apache Cloudberry™ {#cb}

  При создании кластера с СУБД Apache Cloudberry™ создаются следующие ресурсные группы:

  * `admin_group` — назначается ролям с [атрибутом SUPERUSER](cluster-users.md#attributes).
  * `system_group` — используется системными процессами Apache Cloudberry™. Назначить эту группу вручную нельзя.
  * `mdb_admin_group` — группа для администраторов. По умолчанию назначена пользователю-администратору, логин и пароль которого заданы при создании кластера.
    
    Если будет достигнут лимит ресурсов этой группы, пользователь-администратор не сможет подключиться к кластеру и завершить ресурсоемкие процессы. Поэтому ресурсную группу `mdb_admin_group` рекомендуется назначать только пользователям с ролью `mdb_admin`.

  * `default_group` — назначается остальным ролям, если при их создании ресурсная группа не была указана.

  Значения параметров ресурсных групп:

  | Параметр          | `admin_group` | `system_group` | `mdb_admin_group` | `default_group` |
  | ------------------| ------------- | -------------- | ----------------- | --------------- |
  | `CONCURRENCY`     |     `20`      |      `0`       |       `20`        |      `20`       |
  | `CPU_MAX_PERCENT` |     `-1`      |      `10`      |       `1`         |      `20`       |
  | `CPU_WEIGHT`      |     `100`     |      `100`     |       `100`       |      `100`      |
  | `CPUSET`          |     `-1`      |      `-1`      |       `-1`        |      `-1`       |
  | `IO_LIMIT`        |     `-1`      |      `-1`      |       `-1`        |      `-1`       |
  | `MEMORY_QUOTA`    |     `-1`      |      `-1`      |       `-1`        |      `-1`       |
  | `MIN_COST`        |     `0`       |      `500`     |       `0`         |      `500`      |

  Изменить значения параметров для `admin_group` нельзя.

  Подробнее об управлении ролями читайте в разделе [Пользователи и роли](cluster-users.md) и в [документации Apache Cloudberry™](https://cloudberry.apache.org/docs/security/manage-roles-and-privileges/).

- Greenplum® {#gp}

  При создании кластера с СУБД Greenplum® создаются следующие ресурсные группы:

  * `admin_group` — служебная группа, назначенная служебным ролям `monitor` и `gpadmin`.
  * `mdb_admin_group` — группа для администраторов. По умолчанию назначена пользователю-администратору, логин и пароль которого заданы при создании кластера.

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

  * `default_group` — общая группа. Будет назначена новой роли, если для нее явно не задана другая ресурсная группа.

  Значения параметров ресурсных групп:

  | Параметр              | `admin_group` | `mdb_admin_group` | `default_group` |
  | --------------------- | -----------   | ----------- | ----------- |
  | `MEMORY_AUDITOR`      | `vmtracker`   | `vmtracker` | `vmtracker` |
  | `CONCURRENCY`         | `10`          | `20`        | `20`        |
  | `CPU_RATE_LIMIT`      | `10`          | `1`         | `30`        |
  | `CPUSET`              | `-1`          | `-1`        | `-1`        |
  | `MEMORY_LIMIT`        | `10`          | `0`         | `0`         |
  | `MEMORY_SHARED_QUOTA` | `80`          | `80`        | `80`        |
  | `MEMORY_SPILL_RATIO`  | `0`           | `0`         | `0`         |

  Изменить значения параметров для `admin_group` нельзя.

  Подробнее об управлении ролями читайте в разделе [Пользователи и роли](cluster-users.md) и в [документации Greenplum®](https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/6/greenplum-database/admin_guide-roles_privs.html).

{% endlist %}


## Особенности распределения оперативной памяти {#ram}

{% list tabs group=instructions %}

- Apache Cloudberry™ {#cb}

  * Если объем оперативной памяти для ресурсной группы ограничен (параметр `MEMORY_QUOTA`), управление оперативной памятью выполняется на уровне сегмента.
      
    Объем памяти для запроса определяется значением настройки `gp_resgroup_memory_query_fixed_mem`. Если настройка не задана, объем памяти для запроса рассчитывается как `MEMORY_QUOTA ÷ CONCURRENCY`.
    
    Подробнее о настройке `gp_resgroup_memory_query_fixed_mem` в [документации Greenplum®](https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/7/greenplum-database/ref_guide-config_params-guc-list.html#gp_resgroup_memory_query_fixed_mem).

    О дополнительных условиях, влияющих на объем памяти для запроса, читайте в [документации Apache Cloudberry™](https://cloudberry.apache.org/docs/performance/manage-resources-using-resource-groups/#memory-limits).
  
  * Если объем оперативной памяти для ресурсной группы не ограничен, управление оперативной памятью выполняется на уровне запроса. Объем памяти для запроса определяется значением настройки [statement_mem](settings-list.md#setting-statement-mem).

- Greenplum® {#gp}

  * Для каждой ресурсной группы можно зарезервировать долю оперативной памяти сегмента (параметр `MEMORY_LIMIT`). Эта доля делится на _общую квоту_ и _гарантированную квоту_:

    * Общая квота задается параметром `MEMORY_SHARED_QUOTA` и ее могут использовать все транзакции в ресурсной группе. Yandex MPP Analytics for PostgreSQL выдает общую квоту транзакциям по принципу «первый вошел — первый обслужен».
    * Гарантированная квота резервируется для каждой транзакции и вычисляется по формуле:

        `(MEMORY_LIMIT − MEMORY_SHARED_QUOTA) ÷ CONCURRENCY`.

  * Если сумма значений `MEMORY_LIMIT` всех ресурсных групп меньше `100`, то Yandex MPP Analytics for PostgreSQL выделяет незарезервированную оперативную память любым транзакциям любых ресурсных групп по принципу «первый вошел — первый обслужен».

    Транзакция использует незарезервированную оперативную память при соблюдении двух условий:

    * гарантированная доля памяти для транзакции заполнена;
    * общая квота ресурсной группы закончилась.


    Для стабильной и эффективной работы кластера рекомендуется оставлять незарезервированной 10–20% оперативной памяти.

{% endlist %}


## Особенности распределения ресурсов CPU {#cpu}

Выделить ресурсы CPU можно одним из способов:

* Задать процент CPU, который может использовать ресурсная группа на сегменте. В Apache Cloudberry™ процент CPU задается в параметре `CPU_MAX_PERCENT`, а в Greenplum® — в параметре `CPU_RATE_LIMIT`.
 
  При простое ресурсной группы ее ресурсы CPU перераспределяются в пользу ресурсных групп с высокой загрузкой. В Apache Cloudberry™ на распределение ресурсов CPU также влияет приоритет ресурсных групп (параметр `CPU_WEIGHT`). При выходе ресурсной группы из простоя перераспределенные ресурсы CPU возвращаются к ней.

* Указать номера логических ядер CPU, которые будут зарезервированы за ресурсной группой (параметр `CPUSET`). Эти ядра станут недоступны для других ресурсных групп даже при простое ресурсной группы, за которой они зарезервированы. Поэтому рекомендуется свести к минимуму количество ресурсных групп, которые используют зарезервированные ядра.

  {% note warning %}

  Для стабильной работы кластера не резервируйте ядро с номером `0`.

  {% endnote %}

Разные ресурсные группы могут использовать разные способы распределения CPU.

Подробнее о ресурсных группах:

* в [документации Apache Cloudberry™](https://cloudberry.apache.org/docs/performance/manage-resources-using-resource-groups/);
* в [документации Greenplum®](https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/6/greenplum-database/admin_guide-workload_mgmt_resgroups.html).

_Greenplum® и Greenplum Database® являются зарегистрированными товарными знаками или товарными знаками Broadcom Inc в США и/или других странах._

_Apache® и Apache Cloudberry™ являются зарегистрированными товарными знаками или товарными знаками Apache Software Foundation в США и/или других странах._