Перейти к основному содержимому
Версия: 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.