Перейти к основному содержимому
Версия: 2.0.x

Устранение неполадок изоляции ресурсов

Этот раздел содержит ответы на часто задаваемые вопросы об изоляции ресурсов.

Resource Group

Какие ресурсы должны быть настроены в resource group?

Ограничение CPU ресурсов должно быть настроено. Вы должны установить либо cpu_weight, либо exclusive_cpu_core, и значения должны быть больше 0.

Поддерживает ли Selena жёсткие ограничения ресурсов?

Да. Selena поддерживает жёсткие ограничения для памяти. Начиная с версии v1.5.2, Selena поддерживает жёсткие ограничения для CPU через exclusive_cpu_cores.

Как CPU распределяется между resource group?

Когда несколько resource group одновременно выполняют запросы, использование CPU пропорционально cpu_core_limit каждой группы. Если обычная группа превышает BE vCPU cores - short_query.cpu_core_limit в течение цикла планирования, она не будет планироваться далее в этом цикле.

Как рассчитываются ресурсы для resource group short_query?

Когда resource group short_query имеет выполняющиеся запросы, ограничение CPU для всех обычных групп становится BE vCPU cores − short_query.cpu_core_limit. Если resource group short_query простаивает, её ресурсы могут использоваться обычными группами.

Как обрабатываются запросы без соответствующей resource group?

Они используют resource group по умолчанию default_wg, которая имеет следующие ограничения и свойства ресурсов:

  • cpu_core_limit = vCPU cores
  • mem_limit = 100%
  • type = normal

Если resource group rg3 не имеет запросов и все ресурсы выделены resource group rg1 и rg2, будут ли эти ресурсы перераспределены, когда rg3 получит большой запрос?

Да. Перераспределение происходит постепенно и стабилизируется в течение десятков миллисекунд до секунд.

Какова роль classifiers? Что если ни один classifier не соответствует, или два classifier перекрываются?

Если ни один classifier не соответствует, запрос возвращается к resource group по умолчанию default_wg. Classifiers имеют веса; если запрос соответствует нескольким classifiers, выбирается тот, у которого наибольший вес.

Почему resource group требует mem_limit, если BE по умолчанию уже использует 90% памяти?

mem_limit ограничивает память на уровне resource group. Он применяется только к запросам, соответствующим этой resource group.

Если query_type resource group установлен в insert, ограничивает ли INSERT INTO SELECT только INSERT или также SELECT?

Ограничивается только часть SELECT resource group. Операция INSERT не ограничивается.

Если mem_limit resource group установлен в 20%, рассчитывается ли используемая память как BE_memory * 90% * 20%? Что если общий mem_limit превышает 100% при наличии нескольких resource group?

Общий mem_limit по группам может превышать 100%. Но если запрос превышает ограничение своей resource group, он завершится неудачей.

Как проверить, применяется ли resource group к запросу?

Проверьте fe.audit.log или выполните EXPLAIN VERBOSE <SQL>, чтобы просмотреть соответствующую resource group.

Resource group определяются для cluster или для узла BE?

Ресурсы делятся на узел BE, и конфигурация resource group применяется ко всем узлам BE в cluster.

Как проверить использование resource group или метрики мониторинга?

Используйте endpoints метрик FE/BE для просмотра специфических метрик, связанных с resource group.

  • Для FE собирайте следующие метрики из fe_host:8030/metrics?type=json:

    • selena_fe_query_resource_group: Количество запросов, исторически выполненных в этой resource group (включая те, что выполняются в данный момент).
    • selena_fe_query_resource_group_latency: Процентиль задержки запросов для этой resource group. Метка type указывает конкретные процентили, включая mean, 75_quantile, 95_quantile, 98_quantile, 99_quantile, 999_quantile.
    • selena_fe_query_resource_group_err: Количество запросов в этой resource group, которые столкнулись с ошибкой.
  • Для BE собирайте следующие метрики из be_host:8040/metrics?type=json:

    • selena_be_resource_group_cpu_limit_ratio: Соотношение cpu_core_limit этой resource group к общему cpu_core_limit по всем resource group.
    • selena_be_resource_group_mem_limit_bytes: Ограничение памяти для этой resource group.

В чём разница между short_query и обычными resource group? Можно ли создать несколько resource group short_query?

Допускается только одна resource group short_query. Когда в resource group short_query выполняются запросы, она использует фактические ядра BE, в то время как обычные группы делят оставшиеся ресурсы пропорционально.

Предоставляет ли Selena приоритет запросов или приоритизацию на основе больших запросов?

Системы приоритетов не существует. Запрос становится "большим запросом", когда превышает любой из настроенных порогов ресурсов.

Resource group принадлежит конкретному узлу BE или BE, выполняющему запрос?

Resource group применяются единообразно ко всем BE в cluster.

Как следует настраивать concurrency_limit?

Это зависит от сложности запросов, размера cluster и шаблонов нагрузки.

Как работает сопоставление на основе classifiers? Связано ли оно с пользователем и/или базой данных?

Сопоставление зависит от атрибутов classifier, таких как IP, user, db, role или query_type.

Как resource group указывается через переменные сессии?

Вы можете установить её как переменную:

SET resource_group = '<resource_group_name>';

Или указать в запросах через hint:

SELECT /*+ SET_VAR(SET resource_group = '<resource_group_name>') */ * FROM tbl;

Контроль параллелизма действует глобально, на пользователя или на BE?

concurrency_limit ограничивает параллелизм на resource group, в то время как pipeline_dop контролирует параллелизм одного экземпляра pipeline.

Ограничение памяти действует глобально, на пользователя или на BE?

mem_limit применяется к resource group на BE. Память на экземпляр контролируется exec_mem_limit.

Ограничения параллелизма и памяти действуют только когда resource group включены?

Параллелизм контролируется только resource group. Параллелизм запросов контролируется переменными сессии, такими как pipeline_dop.

Будут ли задачи CTAS соответствовать resource group, если query_type установлен в INSERT?

Да. Resource group ограничит ресурсы для части SELECT задач CTAS. Ограничения для больших запросов также вступят в силу, если часть SELECT превысит порог.

Почему запросы в resource group short_query не могут потреблять весь CPU?

Resource group short_query должна оставить как минимум 1 ядро CPU для обычных групп.

Без очереди запросов и resource group, ограничиваются ли параллельные запросы?

Нет. Перегрузка приводит к таймаутам запросов или ошибкам ограничения памяти.

При включённых resource group, но отключённой очереди запросов, ограничивается ли параллелизм resource group?

Да. Новые запросы, превышающие concurrency_limit resource group, завершатся неудачей.

Когда запрос распознаётся как "большой запрос"?

Запрос считается большим запросом, когда он превышает любое из:

  • big_query_cpu_second_limit
  • big_query_scan_rows_limit
  • big_query_mem_limit

Можно ли изменить ограничения ресурсов default_wg?

Нет. В качестве обходного пути создайте общую resource group, которая может соответствовать всем запросам.

Пример:

CREATE RESOURCE GROUP general_group TO (
query_type IN ('select', 'insert')
)
WITH (
'cpu_core_limit' = '6',
'mem_limit' = '0.0000000000001'
);

Почему метрика "query_resource_group" не показывает недавно созданные группы?

Метрика инициализируется лениво; она появляется только после того, как запрос попадёт в эту группу.

Если много запросов выполняется на BE, и один достигает ограничения CPU, все ли завершаются неудачей?

Только запрос, достигший ограничения, завершается неудачей.

Если узлы BE имеют разные размеры памяти/CPU, влияет ли mem_limit или cpu_core_limit на результаты?

Ограничение памяти является жёстким и может вызвать сбои на BE с меньшим объёмом памяти первыми. CPU является мягким и не вызывает ошибок.

Параметры big_query_ применяются на узел или глобально?

Они применяются на узел BE.

Как настроить resource group для Broker Load?

Пример classifier: query_type="insert", user="alice".

Вопросы, связанные с exec_mem_limit

Q: Сколько экземпляров будет сгенерировано для запроса?

A: Это непредсказуемо, потому что разные запросы могут генерировать разное количество фрагментов.

Q: Как проверить количество экземпляров?

A: Вы не можете проверить количество экземпляров.

Q: Если запрос потребляет 128 ГБ памяти в общей сложности и генерирует 60 экземпляров, при query_mem_limit=0 и exec_mem_limit=2G. Завершится ли запрос неудачей?

A: Запрос завершается неудачей, как только любой экземпляр потребляет более 2 ГБ (exec_mem_limit) памяти.

Как отключить глобальную очередь запросов только для одной resource group?

  1. Включите очередь запросов на уровне resource group:

    SET GLOBAL enable_show_all_variables = true;
    SET enable_group_level_query_queue = true;
  2. Отключите Query Queue для текущей сессии или на уровне пользователя:

    -- Отключить Query Queue для текущей сессии
    SET enable_query_queue = false;
    -- Отключить Query Queue на уровне пользователя
    ALTER USER 'xxx' SET PROPERTIES ("session.enable_query_queue" = "false");

Можно ли заставить запросы, которые не соответствуют ни одной resource group, завершаться неудачей?

Нет. Они всегда будут возвращаться к resource group по умолчанию default_wg.

Query Queue

Как рассчитывается триггер памяти очереди запросов?

Триггер Query Queue = доступный размер памяти BE * query_queue_mem_used_pct_limit.

Что имеет приоритет: параллелизм resource group или параллелизм очереди запросов?

Если enable_group_level_query_queue установлен в:

  • false: глобальное или групповое ограничение может сработать первым.
  • true: оба применяются; меньшее ограничение вызывает постановку в очередь.

Если достигнут размер очереди или таймаут, запросы немедленно завершатся неудачей?

  • Когда достигается query_queue_max_queued_queries, запрос немедленно завершается неудачей.
  • Когда достигается query_queue_concurrency_limit, запрос ждёт в очереди.

В чём разница между ограничениями resource group и ограничениями очереди запросов?

Resource group ограничивают использование ресурсов на группу на узел BE.

Query Queue использует ограничения на уровне BE для всех запросов.

concurrency_limit и max_cpu_cores оба применяются, когда очередь запросов на уровне resource group включена.

В чём разница между pipeline_dop, exec_mem_limit и ограничениями параллелизма resource group?

pipeline_dop контролирует параллелизм внутри запроса.

Resource groups/query queue контролируют параллельные запросы в масштабе cluster.

query_mem_limit контролирует память на запрос на BE.