Управление ресурсами

Параметры конфигурации

В следующей таблице перечислены настраиваемые параметры групп ресурсов.

Parameter Описание Допустимый диапазон Значение по умолчанию
CONCURRENCY Максимальное количество одновременных транзакций (активных и простаивающих), разрешённых в группе ресурсов. [0 – max_connections] 20
CPU_MAX_PERCENT Максимальный процент ресурсов ЦПУ, который может использовать группа ресурсов. [1 – 100] -1 (отключено)
CPU_WEIGHT Вес приоритета планирования для группы ресурсов. [1 – 500] 100
CPUSET Конкретные логические ядра ЦПУ (или гиперпотоки), зарезервированные для группы ресурсов. Зависит от системы -1
MEMORY_QUOTA Лимит памяти (в МБ), выделяемой группе ресурсов. Целое число (МБ) -1 (отключено; используется statement_mem как лимит памяти на запрос)
MIN_COST Минимальная стоимость плана запроса, необходимая для управления запросом через группу ресурсов. Целое число 0
IO_LIMIT Управляет использованием дискового ввода-вывода путём установки максимальной пропускной способности и IOPS для операций чтения/записи. Настраивается отдельно для каждого табличного пространства. [2 – 4294967295 или max] -1

Примечание!
Группы ресурсов не применяются к командам SET, RESET и SHOW.

Подробности конфигурации

Когда пользователь выполняет запрос, YMatrix проверяет его на соответствие ограничениям, заданным для назначенной группы ресурсов.

Управление параллельностью

CONCURRENCY ограничивает максимальное количество одновременных транзакций в группе ресурсов. Значение по умолчанию — 20. Значение 0 запрещает выполнение запросов в группе.

Если лимиты ресурсов не превышены и запрос не нарушает ограничение параллельности, YMatrix выполняет его немедленно.
Если достигнут лимит параллельности, последующие транзакции ставятся в очередь до завершения других запросов.

Параметр gp_resource_group_queuing_timeout определяет, как долго ожидающая транзакция может находиться в очереди перед отменой. Значение по умолчанию — 0, что означает неограниченное ожидание.

Обход ограничений групп ресурсов

  • gp_resource_group_bypass: при значении true обходит ограничения параллельности для текущего сеанса, позволяя немедленно выполнять запрос. Память выделяется согласно statement_mem. Если недостаточно памяти, запрос завершается ошибкой. Этот параметр действует только на уровне сеанса и не может использоваться внутри транзакции или функции.
  • gp_resource_group_bypass_catalog_query: определяет, обходят ли запросы к каталогу ограничения групп ресурсов. Значение по умолчанию — true. Полезно для клиентов с графическим интерфейсом, выполняющих метаданные-запросы. Такие запросы работают вне групп ресурсов и используют statement_mem для выделения памяти.
  • gp_resource_group_bypass_direct_dispatch: при значении true запросы с прямой диспетчеризацией (direct-dispatch) обходят ограничения ЦПУ и памяти своей группы ресурсов. Память выделяется через statement_mem, и запрос завершается ошибкой при нехватке памяти. Этот параметр действует только на уровне сеанса и не может использоваться внутри транзакций или функций.

Управление ресурсами ЦПУ

YMatrix поддерживает два режима выделения ЦПУ:

  1. На основе процентов
  2. На основе ядер

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

Параметр gp_resource_group_cpu_limit задаёт максимальный процент системных ресурсов ЦПУ, который может быть выделен группам ресурсов на каждом сегменте.

Выделение ЦПУ по ядрам

CPUSET указывает ядра ЦПУ, зарезервированные для группы ресурсов. При настройке CPUSET YMatrix отключает CPU_MAX_PERCENT и CPU_WEIGHT для этой группы и устанавливает оба значения в -1.

Примечания по использованию:

  • Используйте точку с запятой (;) для разделения спецификаций ядер master и segment. Используйте запятые (,) для перечисления отдельных ядер или диапазонов, заключённых в одинарные кавычки. Пример: '1;1,3-4' назначает ядро 1 на master и ядра 1, 3 и 4 на сегментах.
  • Избегайте использования ядра 0. Предпочтительно назначать ядра с меньшими номерами. Если база данных восстанавливается на узле с меньшим количеством ядер ЦПУ, чем исходный (например, конфигурация 16 ядер восстанавливается на 8-ядерном узле), операции могут завершиться ошибкой. Например, назначение ядра 9 на 16-ядерной системе приведёт к сбою на 8-ядерной системе.

Выделение ЦПУ по процентам

CPU_MAX_PERCENT устанавливает верхний предел использования ЦПУ на сегменте. Например, значение 40 позволяет использовать до 40% доступных ресурсов ЦПУ. Неиспользуемое процессорное время объединяется в общий пул и может быть заимствовано другими группами ресурсов.

CPU_WEIGHT определяет относительную долю времени ЦПУ, которую получает группа при конкуренции за ресурсы. Значение по умолчанию — 100, диапазон — от 1 до 500.

Примечания по использованию:

  • Если одна группа имеет вес 100, а две другие — по 50 (все с CPU_MAX_PERCENT=100), первая группа получает 50% общего времени ЦПУ, а остальные — по 25% каждая.
  • Добавление ещё одной группы с весом 100 снижает долю первой группы до 33%, а остальные получают примерно по 16,5%, 16,5% и 33%.

Пример конфигурации

Имя группы CONCURRENCY CPU_MAX_PERCENT CPU_WEIGHT
default_group 20 50 10
admin_group 10 70 30
system_group 10 30 10
test 10 10 10
  • default_group: относительная доля = 10/(10+30+10+10) = 16%. При высокой нагрузке получает как минимум 16% ЦПУ. При наличии свободных ресурсов может использовать до своего жёсткого лимита в 50%.
  • admin_group: относительная доля = 30/60 = 50%. Может использовать до 70% при простое системы.
  • test: относительная доля = 16%, но ограничена сверху значением CPU_MAX_PERCENT=10, даже при простое системы.

Управление ресурсами памяти

MEMORY_QUOTA определяет общий объём памяти (в МБ), резервируемой для группы ресурсов на каждом сегменте. Это суммарный объём памяти, доступный всем активным запросам в группе. Память на запрос рассчитывается как MEMORY_QUOTA / CONCURRENCY.

Чтобы переопределить это поведение, используйте параметр сессии gp_resgroup_memory_query_fixed_mem, чтобы задать фиксированный объём памяти для запроса, который может превышать выделение группы.

Примечания по использованию:

  • Если задан gp_resgroup_memory_query_fixed_mem, он переопределяет настройки памяти группы ресурсов.
  • Если не задан, память на запрос = MEMORY_QUOTA / CONCURRENCY.
  • Если MEMORY_QUOTA не задан, используется statement_mem как лимит на запрос.
  • При нехватке системной памяти запросы выгружаются на диск. Если достигнут лимит gp_workfile_limit_files_per_query, YMatrix выдаёт ошибку нехватки памяти (OOM).

Пример сценария

Рассмотрим группу ресурсов adhoc с MEMORY_QUOTA = 1536 МБ и CONCURRENCY = 3. Каждый запрос обычно получает 512 МБ.

  • Пользователь ADHOC_1 отправляет Q1 с gp_resgroup_memory_query_fixed_mem = 800 МБ → разрешено.
  • Пользователь ADHOC_2 отправляет Q2 со значением по умолчанию 512 МБ.
  • Во время выполнения Q1 и Q2 пользователь ADHOC_3 отправляет Q3 (512 МБ). Общее потребление = 1312 МБ. Если системная память позволяет, Q3 выполняется.
  • Пользователь ADHOC_4 отправляет Q4 с gp_resgroup_memory_query_fixed_mem = 700 МБ. Поскольку он обходит ограничения группы, запрос выполняется немедленно.

Особые случаи

  • Запросы, обходящие ограничения через gp_resource_group_bypass или gp_resource_group_bypass_catalog_query, используют statement_mem как лимит памяти.
  • Если (MEMORY_QUOTA / CONCURRENCY) < statement_mem, то statement_mem используется как фиксированный лимит памяти на запрос.
  • statement_mem ограничен сверху значением max_statement_mem.
  • Запросы со стоимостью плана ниже MIN_COST используют statement_mem как квоту памяти.

Управление ресурсами ввода-вывода

IO_LIMIT ограничивает максимальную пропускную способность дискового ввода-вывода и IOPS (операций чтения/записи в секунду) для запросов в группе ресурсов, обеспечивая справедливое распределение пропускной способности и предотвращая насыщение. Этот параметр настраивается отдельно для каждого табличного пространства.

Примечание!
IO_LIMIT поддерживается только с cgroup v2.

Ограничения ввода-вывода настраиваются с помощью:

  • Имени или OID табличного пространства (используйте * для всех табличных пространств).
  • rbps / wbps: максимальная пропускная способность чтения/записи в МБ/с. По умолчанию: max (без ограничений).
  • riops / wiops: максимальное количество IOPS чтения/записи. По умолчанию: max (без ограничений).

Примечания по конфигурации

Если IO_LIMIT не задан, все параметры ввода-вывода по умолчанию принимают значение max (без ограничений). Если указаны только некоторые значения (например, rbps), остальные (wbps, riops, wiops) по умолчанию принимают значение max.