Learning Platform
Глоссарий Troubleshooting
Урок 13.09 · 30 мин
Продвинутый
CREATE RESOURCECREATE WORKLOADworkload schedulingpriorityweight

Workload Scheduling: управление ресурсами

В multi-tenant ClickHouse разные типы запросов конкурируют за общие ресурсы — IO и CPU. Без управления ETL-задачи, которые читают терабайты данных, легко вытесняют интерактивные запросы дашборда. Workload scheduling — механизм fair resource allocation: он распределяет IO и CPU между группами запросов согласно заданным приоритетам и весам.

WARNING

XML-конфигурация для workload management устарела (deprecated). Используйте SQL DDL (CREATE RESOURCE / CREATE WORKLOAD). XML-конфиги не видны через SHOW RESOURCES / SHOW WORKLOADS и не поддерживают runtime-изменения без перезапуска сервера. Все примеры в этом уроке используют SQL DDL.


CREATE RESOURCE: объявление ресурсов

Ресурс (RESOURCE) — это физический ресурс сервера, доступом к которому управляет планировщик.

IO-ресурс

-- IO-ресурс: охватывает чтение и запись на все диски
CREATE RESOURCE all_io (READ ANY DISK, WRITE ANY DISK);

READ ANY DISK и WRITE ANY DISK означают, что планировщик контролирует все дисковые операции чтения и записи. Можно ограничить конкретным диском: READ DISK s3_cold.

CPU-ресурс (26.3 LTS / 25.8+)

-- CPU slot scheduling (доступно с версии 25.8)
CREATE RESOURCE cpu (MASTER THREAD, WORKER THREAD);

CPU slot scheduling управляет выделением CPU-потоков между workloads. MASTER THREAD — поток координации запроса, WORKER THREAD — рабочие потоки обработки данных.


CREATE WORKLOAD: иерархия групп

Workload (WORKLOAD) — именованная группа запросов с заданными параметрами доступа к ресурсам. Workloads организуются в дерево: корневой workload агрегирует ресурсы, дочерние делят их между собой.

Простая иерархия: interactive vs reporting

-- Корневой workload (без PARENT)
CREATE WORKLOAD all;

-- Интерактивные запросы: высокий приоритет, 80% ресурсов
CREATE WORKLOAD interactive
    PARENT all
    SETTINGS priority = 0, weight = 80;

-- Reporting-запросы: низкий приоритет, 20% ресурсов
CREATE WORKLOAD reporting
    PARENT all
    SETTINGS priority = 1, weight = 20;
Иерархия Workload Scheduling
all (root)all (root workload): корневой узел иерархии. Агрегирует все ресурсы (all_io, cpu). Дочерние workloads делят ресурсы root-а согласно своим priority и weight. Запросы без явного SET workload попадают в root.
ресурсы делятся между дочерними
interactive priority=0, weight=80interactive (priority=0, weight=80): высокоприоритетная группа для запросов дашборда и ad-hoc аналитики. priority=0 означает наивысший приоритет — при конкуренции получает ресурсы первым. weight=80 означает 80% ресурсов при одновременном исполнении с другими workloads.
reporting priority=1, weight=20reporting (priority=1, weight=20): группа для batch-отчётов и фоновой аналитики. priority=1 — более низкий приоритет, чем interactive. weight=20 — 20% ресурсов при конкуренции. При отсутствии запросов в interactive — reporting может использовать все доступные ресурсы.

Параметры SETTINGS

ПараметрЗначениеОписание
priority0, 1, 2, …Приоритет: 0 = наивысший. При конкуренции workload с меньшим priority получает ресурсы первым
weight1..100Доля ресурсов при одновременной работе нескольких workloads одного приоритета

Использование: маркировка запросов

Запрос назначается в workload через SET workload:

-- Маркировать сессию как interactive
SET workload = 'interactive';
SELECT count() FROM events WHERE event_type = 'purchase';

-- Маркировать сессию как reporting
SET workload = 'reporting';
SELECT user_id, sum(revenue) FROM orders GROUP BY user_id;

Настройку можно зафиксировать на уровне роли или пользователя:

-- ETL-пользователь всегда в reporting workload
ALTER USER etl_user SETTINGS workload = 'reporting';

Трёхуровневая иерархия: interactive / reporting / etl

Для production-систем рекомендуется трёхуровневая иерархия:

-- Ресурсы
CREATE RESOURCE all_io (READ ANY DISK, WRITE ANY DISK);

-- Workload-дерево
CREATE WORKLOAD all;

-- Интерактивные запросы (дашборды, ad-hoc)
CREATE WORKLOAD interactive
    PARENT all
    SETTINGS priority = 0, weight = 70;

-- Отчёты (batch, запускаются раз в час)
CREATE WORKLOAD reporting
    PARENT all
    SETTINGS priority = 1, weight = 20;

-- ETL (фоновая загрузка данных)
CREATE WORKLOAD etl
    PARENT all
    SETTINGS priority = 2, weight = 10;

При такой конфигурации ETL никогда не вытеснит интерактивные запросы: даже если ETL запускает 20 параллельных потоков загрузки, они получают только 10% ресурсов, пока есть активные интерактивные запросы.


Мониторинг

system.scheduler

-- Текущее состояние планировщика
SELECT *
FROM system.scheduler;

SHOW WORKLOADS и SHOW RESOURCES

-- Список workloads
SHOW WORKLOADS;

-- Список ресурсов
SHOW RESOURCES;

Ключевые выводы

  1. CREATE RESOURCE объявляет физический ресурс (IO или CPU) для управления планировщиком. XML-конфиг устарел: не виден через SHOW RESOURCES и требует перезапуска сервера.
  2. CREATE WORKLOAD задаёт именованную группу с priority (0 = наивысший) и weight (доля ресурсов). Workloads образуют дерево с корневым all.
  3. SET workload = 'name' маркирует запрос или сессию в конкретную группу. Можно зафиксировать на уровне пользователя через ALTER USER.
  4. priority определяет порядок доступа при конкуренции: workload с меньшим priority получает ресурсы первым. weight определяет пропорции при одновременной работе равноприоритетных групп.
  5. CPU slot scheduling (MASTER THREAD, WORKER THREAD) доступен с версии 25.8 и позволяет управлять не только IO, но и CPU-потоками.
Spark resource scheduling: Spark Pools, fair scheduler и capacity scheduler Trino Resource Groups: soft/hard concurrency limits и priority queuing

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 3. Аналитик запускает тяжёлый batch-отчёт и хочет, чтобы его запрос был назначен в workload 'reporting', а не конкурировал с интерактивными запросами дашборда. Какую команду нужно выполнить перед запросом?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 10