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

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

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

Параметр Описание Допустимые значения Значение по умолчанию
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

Примечание!
Группы ресурсов не применяются к командам 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 такие запросы игнорируют ограничения ЦПУ и памяти своей группы и выполняются немедленно. Память выделяется согласно statement_mem; её нехватка приводит к ошибке. Этот параметр действует только на уровне сеанса и не может быть изменён внутри транзакций или функций.

Ограничения ЦПУ

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

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

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

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

Распределение ЦПУ по ядрам

Параметр 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, и все три пытаются использовать 100% ЦПУ (то есть CPU_MAX_PERCENT = 100 для всех), первая группа получает 50% общего времени ЦПУ, а остальные — по 25% каждая.
  • Добавление ещё одной группы с весом 100 (и CPU_MAX_PERCENT = 100) изменяет доли: исходная группа получает 33%, две группы с весом 50 — примерно по 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% при высокой нагрузке. При наличии свободного ЦПУ они могут использовать до жёсткого лимита в 50%.
  • Роли в admin_group получают 30/(10+30+10+10) = 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 не задан (то есть равно -1), используется statement_mem как лимит памяти на запрос.
  • Все запросы выгружаются на диск при нехватке системной памяти. Если достигнут лимит файлов выгрузки (gp_workfile_limit_files_per_query), YMatrix выдаёт ошибку нехватки памяти (OOM).

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

Рассмотрим группу ресурсов adhoc с MEMORY_QUOTA = 1536 МБ (1,5 ГБ) и CONCURRENCY = 3. По умолчанию каждый запрос получает 512 МБ (~500 МБ). Рассмотрим следующую последовательность:

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

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

  • Если включены 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 как свою квоту памяти.