StarRocks Resource Group 资源组深度指南:在同一集群中隔离 CPU 与内存、混合运行多类工作负载
【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks
Resource Group(资源组)是 StarRocks 提供的计算资源隔离与管理特性:你可以在单个集群的每个 BE 节点上划分出多个资源组,为短查询、Ad-hoc 查询、ETL 作业、数据导入等不同类型的工作负载分配独立的 CPU 与内存配额,并借助 classifier(分类器)自动将查询路由到对应资源组,从而在不额外部署多套集群的前提下实现资源隔离、避免相互干扰、保障系统稳定性。读完本文,你将掌握资源组从参数含义、创建与修改、分类器匹配规则,到运行期监控与源码级调度原理的完整实战方案。
功能演进与能力矩阵
Resource Group 自 v2.2 引入以来,能力逐步增强:
- v2.2:支持为查询限制资源消耗,实现同一集群内多租户间的资源隔离与高效利用。
- v2.3:可进一步限制大查询(Big Query)的资源消耗,防止超大查询请求耗尽集群资源,保证系统稳定性。
- v2.5:支持限制数据导入(INSERT)的计算资源消耗。
- v3.3.5 起:支持对 CPU 资源施加硬限制(Hard Limit),即 Exclusive Resource Group 与独占 CPU 核。
各版本对能力维度的支持情况如下:
| 版本 | Internal Table | External Table | Big Query Restriction | INSERT INTO | Broker Load | Routine Load / Stream Load / Schema Change | CPU Hard Limit |
|---|---|---|---|---|---|---|---|
| 2.2 | √ | × | × | × | × | × | × |
| 2.3 | √ | √ | √ | × | × | × | × |
| 2.5 | √ | √ | √ | √ | × | × | × |
| 3.1 与 3.2 | √ | √ | √ | √ | √ | × | × |
| 3.3.5 及以后 | √ | √ | √ | √ | √ | × | √ |
从 v3.1.0 起,Resource Group 默认启用,会话变量enable_resource_group已废弃。
核心概念:resource group 与 classifier
resource group
每个资源组(resource group)是某个 BE 上一组计算资源的集合。你可以把集群中的每个 BE 划分成多个资源组;当一个查询被分配到某资源组时,StarRocks 会根据该组配置的资源配额为它分配 CPU 和内存。
在一个 BE 上,可通过以下参数为资源组指定 CPU 与内存配额:
| 参数 | 说明 | 取值范围 | 默认值 |
|---|---|---|---|
| cpu_weight | 该资源组在 BE 节点上的 CPU 调度权重。 | (0,avg_be_cpu_cores](大于 0 时生效) | 0 |
| cpu_weight_percent | 该资源组在 BE 节点上的 CPU 调度权重百分比。v4.1 起支持。 | [0, 100](大于 0 时生效) | 0 |
| exclusive_cpu_cores | 该资源组的 CPU 硬隔离参数(独占核数)。 | (0,min_be_cpu_cores - 1](大于 0 时生效) | 0 |
| exclusive_cpu_percent | 该资源组的 CPU 硬隔离百分比。v4.1 起支持。 | [0, 100](大于 0 时生效) | 0 |
| mem_limit | 该资源组在当前 BE 节点上可用于查询的内存百分比。 | (0, 1](必填) | - |
| mem_pool | 将若干资源组归入同一个共享内存池,共同受mem_limit约束。 | String | default_mem_pool |
| spill_mem_limit_threshold | 触发落盘(spill to disk)的内存使用阈值。 | (0, 1] | 1.0 |
| concurrency_limit | 该资源组中最大的并发查询数。 | Integer(大于 0 时生效) | 0 |
| mem_used_pct_limit | 该资源组的内存使用百分比上限。需要启用enable_group_level_query_queue,且仅当enable_query_queue_v2为false时可用。 | [0, 1](大于 0 时生效) | 0 |
| big_query_cpu_second_limit | 大查询任务在每个 BE 节点上可用的最大 CPU 时间(秒)。 | Integer(大于 0 时生效) | 0 |
| big_query_scan_rows_limit | 大查询任务在每个 BE 节点上可扫描的最大行数。 | Integer(大于 0 时生效) | 0 |
| big_query_mem_limit | 大查询任务在每个 BE 节点上可使用的最大内存。 | Integer(大于 0 时生效) | 0 |
系统内置资源组
每个 StarRocks 实例内置两个系统资源组:default_wg与default_mv_wg。你可以通过ALTER RESOURCE GROUP修改它们的配置,但不能为其定义 classifier,也不能删除它们。
- default_wg:分配给受资源组管理但未匹配到任何 classifier 的普通查询。默认配额:
cpu_weight为 BE 的 CPU 核数、mem_limit为 100%、concurrency_limit为 0、big_query_cpu_second_limit/big_query_scan_rows_limit/big_query_mem_limit均为 0、spill_mem_limit_threshold为 1、mem_used_pct_limit为 0。 - default_mv_wg:分配给在创建物化视图时未通过属性
resource_group指定资源组的异步物化视图刷新任务。默认配额:cpu_weight为 1、mem_limit为 80%、concurrency_limit为 0、spill_mem_limit_threshold为 80%、mem_used_pct_limit为 0。
在 FE 端源码中,这两个内置组的名称被定义为常量DEFAULT_RESOURCE_GROUP_NAME = "default_wg"与DEFAULT_MV_RESOURCE_GROUP_NAME = "default_mv_wg"(见 ResourceGroup.java)。
classifier
每个 classifier(分类器)包含一个或多个条件,用于匹配查询的属性。StarRocks 根据匹配条件为每个查询找出匹配度最高的 classifier,并据此分配运行资源。classifier 支持以下条件:
user:用户名。role:用户角色。query_type:查询类型,支持SELECT与(v2.5 起)INSERT。当 INSERT INTO 或 BROKER LOAD 任务命中query_type为insert的资源组时,BE 会为任务预留指定的 CPU 资源。source_ip:查询发起的 CIDR 网段。db:查询访问的数据库,可用逗号,分隔的字符串指定多个。plan_cpu_cost_range:查询的预估 CPU 消耗区间,格式为(DOUBLE, DOUBLE],默认 NULL 表示不限制。fe.audit.log中的PlanCpuCost列即系统对查询 CPU 成本的预估。v3.1.4 起支持。plan_mem_cost_range:查询的预估内存消耗区间,格式为(DOUBLE, DOUBLE],默认 NULL 表示不限制。fe.audit.log中的PlanMemCost列即系统对查询内存成本的预估。v3.1.4 起支持。
一个 classifier 只有在“一个或全部”条件与查询信息匹配时才匹配该查询。若多个 classifier 同时匹配,StarRocks 会计算每个 classifier 与查询的匹配度,选择匹配度最高的那个。匹配度的计算规则如下:
- 与查询的
user相同:匹配度 +1。 - 与查询的
role相同:匹配度 +1。 - 与查询的
query_type相同:匹配度 +1 + 1/(该 classifier 中query_type字段的数量)。 - 与查询的
source_ip相同:匹配度 +1 + (32 -cidr_prefix)/64。 - 与查询的
db相同:匹配度 +10。 - 查询 CPU 成本落在
plan_cpu_cost_range内:匹配度 +1。 - 查询内存成本落在
plan_mem_cost_range内:匹配度 +1。
在 FE 端,ResourceGroupClassifier.weight()(见 ResourceGroupClassifier.java)封装了上述匹配度的计算,而 ResourceGroupMgr.java 在对候选 classifier 排序时正是以weight()作为比较键。
匹配规则的进一步细化:
- 条件更多的 classifier 匹配度更高:
-- Classifier B 的条件多于 Classifier A,因此 B 的匹配度更高。 classifier A (user='Alice') classifier B (user='Alice', source_ip = '192.168.1.0/24')- 条件数相同时,描述更精确的 classifier 匹配度更高:
-- Classifier B 的 CIDR 网段比 Classifier A 更小,因此 B 的匹配度更高。 classifier A (user='Alice', source_ip = '192.168.1.0/16') classifier B (user='Alice', source_ip = '192.168.1.0/24') -- Classifier C 指定的查询类型比 Classifier D 更少,因此 C 的匹配度更高。 classifier C (user='Alice', query_type in ('select')) classifier D (user='Alice', query_type in ('insert','select'))- 若多个 classifier 匹配度相同,则随机选择其中一个:
-- 如果某查询同时访问 db1 和 db2,且 classifier E、F 在所有命中分类器中匹配度并列最高,则随机选择 E 或 F。 classifier E (db='db1') classifier F (db='db2')资源参数详解
CPU 资源参数
cpu_weight与cpu_weight_percent
这两个参数指定资源组在单个 BE 节点上的 CPU 调度权重,决定该组任务可获得的 CPU 时间相对份额。v3.3.5 之前,它们被统称为cpu_core_limit。两种设置方式二选一:
cpu_weight:直接设置 CPU 调度权重,取值范围 (0,avg_be_cpu_cores],其中avg_be_cpu_cores是所有 BE 节点的平均 CPU 核数,仅在大于 0 时生效。cpu_weight_percent:v4.1 起支持,以百分比形式设置权重,取值范围 [0, 100],仅在大于 0 时生效。若min_be_cpu_cores * cpu_weight_percent / 100 < 1,系统会报错,其中min_be_cpu_cores是所有 BE 节点中最小的 CPU 核数。
运行时,每个 BE 会依据自身核数be_cpu_cores将百分比换算成实际权重:cpu_weight = be_cpu_cores * cpu_weight_percent / 100。
注意:cpu_weight、cpu_weight_percent、exclusive_cpu_cores、exclusive_cpu_percent四者中,同一时刻只能有一个大于 0。
说明例如有三个资源组 rg1、rg2、rg3,cpu_weight 分别为 2、6、8。在满负载的 BE 节点上,三组分别获得 12.5%、37.5%、50% 的 CPU 时间;若节点并非满负载,只有 rg1 和 rg2 有负载而 rg3 空闲,则 rg1 和 rg2 分别获得 25% 和 75% 的 CPU 时间。
从源码看,BE 端采用基于vruntime的调度实体来保证权重公平:WorkGroupSchedState维护每个组的_vruntime_ns,调度时按runtime_ns = vruntime_ns * cpu_weight参与比较(见 work_group.h),权重越大,同等运行时间内 vruntime 增长越慢,从而获得更多 CPU 份额。
exclusive_cpu_cores与exclusive_cpu_percent
这两个参数定义资源组的 CPU 硬隔离(v3.3.5 起),包含两层含义:
- 独占(Exclusive):为该资源组预留指定数量的 CPU 核,即使空闲其他组也不可使用。
- 配额(Quota):限制该资源组只能使用这些预留核,不能占用其他组的可用 CPU 资源。
两种设置方式二选一:
exclusive_cpu_cores:直接设置预留核数,取值范围 (0,min_be_cpu_cores - 1],仅在大于 0 时生效。exclusive_cpu_percent:v4.1 起支持,以百分比形式设置预留核数,取值范围 [0, 100],仅在大于 0 时生效。若min_be_cpu_cores * exclusive_cpu_percent / 100 < 1,系统会报错。
运行时,每个 BE 会将exclusive_cpu_percent按自身核数换算为实际核数:exclusive_cpu_cores = be_cpu_cores * exclusive_cpu_percent / 100。
要点说明:
- 设置了
exclusive_cpu_cores/exclusive_cpu_percent(大于 0)的资源组称为Exclusive Resource Group(独占资源组),分配给它的核称为Exclusive Cores(独占核);其他组称为Shared Resource Group(共享资源组),运行在Shared Cores(共享核)上。 - 所有独占资源组的
exclusive_cpu_cores总和不能超过min_be_cpu_cores - 1;若使用exclusive_cpu_percent,系统先按min_be_cpu_cores * exclusive_cpu_percent / 100换算成核数再求和。上限预留至少 1 个共享核。 - 独占资源组在自己预留的独占核上运行,无需通过
cpu_weight/cpu_weight_percent争取 CPU 时间。 - 是否允许共享资源组在独占资源组空闲时借用独占核,由 BE 配置
enable_resource_group_cpu_borrowing控制;设为true(默认值)时允许借用。该配置可动态修改:
UPDATE information_schema.be_configs SET VALUE = "false" WHERE NAME = "enable_resource_group_cpu_borrowing";在 BE 端,线程池管理器PipelineExecutorSetManager(见 pipeline_executor_set_manager.h)直接接收borrowed_cpuids参数,并维护enable_resource_group_cpu_borrowing开关;运行在借用核上的任务需要“让位”(yield)给独占核的属主资源组新到达的任务,从而保证独占组的核心不受影响。thrift 协议层(见 WorkGroup.thrift)中定义了exclusive_cpu_cores、cpu_weight_percent、exclusive_cpu_percent等字段,用于 FE 与 BE 之间同步资源组定义。
说明(作用域):CPU 与内存资源参数均以单个 BE 节点为作用域生效。
type(v3.3.5 起已废弃)
v3.3.5 之前,StarRocks 允许把资源组的type设置为short_query;该参数现已被exclusive_cpu_cores取代。升级到 v3.3.5 后,系统会自动把此类资源组转换为 Exclusive Resource Group,转换后exclusive_cpu_cores的值等于原cpu_weight。FE 端 ResourceGroup.java 中保留了此兼容逻辑(short_query类型沿用cpu_weight作为独占核数)。
内存资源参数
mem_limit
指定资源组在当前 BE 节点上可用的查询内存(query pool)百分比,取值范围 (0, 1],创建资源组时为必填项。
mem_pool
v4.0 起支持。指定共享内存池标识。具有相同mem_pool标识的资源组共享一个内存池,共同受mem_limit约束;若未指定,资源组归入default_mem_pool,其内存使用仅受自身mem_limit限制。所有共享同一mem_pool的资源组必须配置相同的mem_limit。
例如,将两个资源组的总内存消耗共同限制在 50%:
CREATE RESOURCE GROUP rg1 TO (db='db1') WITH ( 'mem_limit' = '50%', 'mem_pool' = 'shared_pool' ); CREATE RESOURCE GROUP rg2 TO (db='db1') WITH ( 'mem_limit' = '50%', 'mem_pool' = 'shared_pool' );spill_mem_limit_threshold
定义触发落盘(spill to disk)的内存使用阈值,取值范围 (0, 1],默认 1 表示不生效。v3.1.7 引入。BE 端构造WorkGroup时会据此计算_spill_mem_limit_bytes = _spill_mem_limit_threshold * _memory_limit_bytes(见 work_group.cpp)。
- 启用自动落盘(
spill_mode为auto)但未启用资源组时:当查询内存使用超过query_mem_limit的 80% 时,系统将中间结果落盘。 - 启用资源组时,满足以下任一条件即触发落盘:
- 组内所有查询的内存总量超过
当前 BE 内存上限 * mem_limit * spill_mem_limit_threshold; - 当前查询的内存使用超过
query_mem_limit的 80%。
- 组内所有查询的内存总量超过
查询并发参数
concurrency_limit
定义资源组内最大并发查询数,用于防止系统过载。仅在大于 0 时生效,默认 0。
mem_used_pct_limit
定义该资源组在 BE 节点上的内存使用百分比上限,超过后该资源组被视为过载(overloaded)。取值范围 [0, 1],仅在大于 0 时生效,默认 0。若资源组使用共享mem_pool(非default_mem_pool),则按该 BE 上池级别的内存使用与上限进行评估。该参数仅对资源组级查询队列生效,且需要全局会话变量enable_group_level_query_queue为true;它仅在 FE 配置项enable_query_queue_v2为false时可用。
大查询资源参数
以下参数用于为大型查询单独配置资源上限,均在大于 0 时生效,默认 0:
big_query_cpu_second_limit:大查询任务在每个 BE 节点上可用的最大 CPU 时间(秒),并行任务的真实 CPU 时间累加计算。big_query_scan_rows_limit:大查询任务在每个 BE 节点上可扫描的最大行数。big_query_mem_limit:大查询任务在每个 BE 节点上可使用的最大内存(字节)。
注意当资源组中的查询超过上述大查询限制时,查询会被终止并报错。你也可以在 FE 节点fe.audit.log的
ErrorCode列查看错误信息。
BE 端为每个资源组维护了WorkGroupQueryStats(cpu_runtime_ns、scan_rows、scan_rows_limit,见 work_group.h),用于在运行时累计 CPU 时间与扫描行数并触发大查询限制。
隔离计算资源:实操手册
启用资源组
使用资源组前需确保集群已启用 Pipeline Engine:
-- 在当前会话启用 Pipeline Engine。 SET enable_pipeline_engine = true; -- 全局启用 Pipeline Engine。 SET GLOBAL enable_pipeline_engine = true;注意从 v3.1.0 起,Resource Group 默认启用,会话变量
enable_resource_group已废弃。
创建资源组与分类器
CREATE RESOURCE GROUP用于创建资源组、关联 classifier 并分配计算资源(需要 SYSTEM 级 CREATE RESOURCE GROUP 权限,可通过 GRANT 授予)。完整语法参见 CREATE_RESOURCE_GROUP.md:
CREATE RESOURCE GROUP <group_name> TO ( user='string', role='string', query_type in ('select'), source_ip='cidr' ) -- 创建 classifier。若创建多个 classifier,用逗号 (,) 分隔。 WITH ( "{ cpu_weight | exclusive_cpu_cores }" = "INT", "mem_limit" = "m%", "concurrency_limit" = "INT", "type" = "str" -- 资源组类型,取值 normal。 );示例一:创建共享资源组rg1,附带多个 classifier,并配置大查询限制:
CREATE RESOURCE GROUP rg1 TO (user='rg1_user1', role='rg1_role1', query_type in ('select'), source_ip='192.168.x.x/24'), (user='rg1_user2', query_type in ('select'), source_ip='192.168.x.x/24'), (user='rg1_user3', source_ip='192.168.x.x/24'), (user='rg1_user4'), (db='db1') WITH ( 'cpu_weight' = '10', 'mem_limit' = '20%', 'big_query_cpu_second_limit' = '100', 'big_query_scan_rows_limit' = '100000', 'big_query_mem_limit' = '1073741824' );示例二:创建独占资源组rg2,通过exclusive_cpu_cores预留 10 个 CPU 核:
CREATE RESOURCE GROUP rg2 TO (user='rg1_user5', role='rg1_role5', query_type in ('select'), source_ip='192.168.x.x/24'), (user='rg1_user6', query_type in ('select'), source_ip='192.168.x.x/24'), (user='rg1_user7', source_ip='192.168.x.x/24'), (user='rg1_user8'), (db='db2') WITH ('exclusive_cpu_cores' = '10', 'mem_limit' = '20%', 'type' = 'normal', 'big_query_cpu_second_limit' = '100', 'big_query_scan_rows_limit' = '100000', 'big_query_mem_limit' = '1073741824' );为当前会话指定资源组(可选)
你可以为当前会话直接指定资源组(包括default_wg和default_mv_wg):
SET resource_group = 'group_name';查看资源组与分类器
查看所有资源组与分类器:
SHOW RESOURCE GROUPS ALL;查看当前登录用户可见的资源组与分类器:
SHOW RESOURCE GROUPS;查看指定资源组及其分类器:
SHOW RESOURCE GROUP group_name;示例输出:
mysql> SHOW RESOURCE GROUPS ALL; +---------------+-------+------------+---------------------+-----------+----------------------------+---------------------------+---------------------+-------------------+---------------------------+----------------------------------------+---------------------+ | name | id | cpu_weight | exclusive_cpu_cores | mem_limit | big_query_cpu_second_limit | big_query_scan_rows_limit | big_query_mem_limit | concurrency_limit | spill_mem_limit_threshold | classifiers | mem_used_pct_limit | +---------------+-------+------------+---------------------+-----------+----------------------------+---------------------------+---------------------+-------------------+---------------------------+----------------------------------------+---------------------+ | default_mv_wg | 3 | 1 | 0 | 80.0% | 0 | 0 | 0 | null | 80% | (id=0, weight=0.0) | null | | default_wg | 2 | 1 | 0 | 100.0% | 0 | 0 | 0 | null | 100% | (id=0, weight=0.0) | null | | rge1 | 15015 | 0 | 6 | 90.0% | 0 | 0 | 0 | null | 100% | (id=15016, weight=1.0, user=rg1_user) | null | | rgs1 | 15017 | 8 | 0 | 90.0% | 0 | 0 | 0 | null | 100% | (id=15018, weight=1.0, user=rgs1_user) | null | | rgs2 | 15019 | 8 | 0 | 90.0% | 0 | 0 | 0 | null | 100% | (id=15020, weight=1.0, user=rgs2_user) | null | +---------------+-------+------------+---------------------+-----------+----------------------------+---------------------------+---------------------+-------------------+---------------------------+----------------------------------------+---------------------+注意上例中
weight表示匹配度。
如需查看资源组的全部字段(含已废弃字段,如type、max_cpu_cores),可在上述三条命令中加入关键字VERBOSE:
SHOW VERBOSE RESOURCE GROUPS ALL; SHOW VERBOSE RESOURCE GROUPS; SHOW VERBOSE RESOURCE GROUP group_name;管理资源组与分类器
修改已有资源组的资源配额:
ALTER RESOURCE GROUP group_name WITH ( 'cpu_core_limit' = 'INT', 'mem_limit' = 'm%' );提示:语法细节与全部可用参数可参考 ALTER_RESOURCE_GROUP.md。
删除资源组:
DROP RESOURCE GROUP group_name;为资源组添加 classifier:
ALTER RESOURCE GROUP <group_name> ADD (user='string', role='string', query_type in ('select'), source_ip='cidr');按 classifier ID 删除指定 classifier:
ALTER RESOURCE GROUP <group_name> DROP (CLASSIFIER_ID_1, CLASSIFIER_ID_2, ...);删除资源组的所有 classifier:
ALTER RESOURCE GROUP <group_name> DROP ALL;观察资源组:查询归属、监控指标与线程信息
查看查询所属的资源组
- 未执行的查询:通过
EXPLAIN VERBOSE <query>返回的RESOURCE GROUP字段查看。 - 运行中的查询:通过
SHOW PROC '/current_queries'和SHOW PROC '/global_current_queries'返回的ResourceGroup字段查看。 - 已完成的查询:查看 FE 节点fe.audit.log中的
ResourceGroup字段。- 若查询不受资源组管理,该列值为空字符串
""; - 若查询受资源组管理但未匹配任何 classifier,则被分配到默认资源组
default_wg。
- 若查询不受资源组管理,该列值为空字符串
监控资源组
你可以为资源组配置监控与告警。以下 FE 与 BE 指标均带有name标签,标识其对应的资源组。
FE 指标
以下 FE 指标仅统计当前 FE 节点内的数据:
| Metric | 单位 | 类型 | 说明 |
|---|---|---|---|
| starrocks_fe_query_resource_group | Count | Instantaneous | 该资源组历史运行的查询数(含当前运行中)。 |
| starrocks_fe_query_resource_group_latency | ms | Instantaneous | 该资源组的查询延迟百分位。标签type表示具体百分位,包括mean、75_quantile、95_quantile、98_quantile、99_quantile、999_quantile。 |
| starrocks_fe_query_resource_group_err | Count | Instantaneous | 该资源组中发生错误的查询数。 |
| starrocks_fe_resource_group_query_queue_total | Count | Instantaneous | 该资源组历史排队查询总数(含当前运行中)。v3.1.4 起支持,仅在启用查询队列时有效。 |
| starrocks_fe_resource_group_query_queue_pending | Count | Instantaneous | 该资源组当前队列中的查询数。v3.1.4 起支持,仅在启用查询队列时有效。 |
| starrocks_fe_resource_group_query_queue_timeout | Count | Instantaneous | 该资源组中在队列中等待超时的查询数。v3.1.4 起支持,仅在启用查询队列时有效。 |
BE 指标
| Metric | 单位 | 类型 | 说明 |
|---|---|---|---|
| resource_group_running_queries | Count | Instantaneous | 该资源组当前正在运行的查询数。 |
| resource_group_total_queries | Count | Instantaneous | 该资源组历史运行的查询数(含当前运行中)。 |
| resource_group_bigquery_count | Count | Instantaneous | 该资源组中触发大查询限制的查询数。 |
| resource_group_concurrency_overflow_count | Count | Instantaneous | 该资源组中触发concurrency_limit限制的查询数。 |
| resource_group_mem_limit_bytes | Bytes | Instantaneous | 该资源组的内存上限。 |
| resource_group_mem_inuse_bytes | Bytes | Instantaneous | 该资源组当前已使用的内存。 |
| resource_group_cpu_limit_ratio | Percentage | Instantaneous | 该资源组的cpu_core_limit占所有资源组cpu_core_limit总和的比例。 |
| resource_group_inuse_cpu_cores | Count | Average | 该资源组当前使用的 CPU 核数估计值(近似值,为相邻两次指标采集统计的平均值)。v3.1.4 起支持。 |
| resource_group_cpu_use_ratio | Percentage | Average | 已废弃该资源组使用的 Pipeline 线程时间片占所有资源组 Pipeline 线程时间片总数的比例(相邻两次采集的平均值)。 |
| resource_group_connector_scan_use_ratio | Percentage | Average | 已废弃该资源组使用的外表 Scan 线程时间片占所有资源组 Pipeline 线程时间片总数的比例(相邻两次采集的平均值)。 |
| resource_group_scan_use_ratio | Percentage | Average | 已废弃该资源组使用的内表 Scan 线程时间片占所有资源组 Pipeline 线程时间片总数的比例(相邻两次采集的平均值)。 |
查看资源组使用信息
v3.1.4 起,可用 SQL 语句 SHOW USAGE RESOURCE GROUPS 查看各资源组在各 BE 上的使用情况,该操作无需权限。字段说明:
Name:资源组名称。Id:资源组 ID。Backend:BE 的 IP 或 FQDN。BEInUseCpuCores:该资源组在该 BE 上当前使用的 CPU 核数(近似估计值)。BEInUseMemBytes:该资源组在该 BE 上当前使用的内存字节数。BERunningQueries:该资源组在该 BE 上仍在运行的查询数。
注意事项:
- BE 会以
report_resource_usage_interval_ms指定的间隔(默认 1 秒)定期向 Leader FE 上报该资源使用信息。 - 结果只显示
BEInUseCpuCores/BEInUseMemBytes/BERunningQueries中至少一项为正数的行,即资源组在某 BE 上实际占用资源时才展示。
示例:
MySQL [(none)]> SHOW USAGE RESOURCE GROUPS; +------------+----+-----------+-----------------+-----------------+------------------+ | Name | Id | Backend | BEInUseCpuCores | BEInUseMemBytes | BERunningQueries | +------------+----+-----------+-----------------+-----------------+------------------+ | default_wg | 0 | 127.0.0.1 | 0.100 | 1 | 5 | +------------+----+-----------+-----------------+-----------------+------------------+ | default_wg | 0 | 127.0.0.2 | 0.200 | 2 | 6 | +------------+----+-----------+-----------------+-----------------+------------------+ | wg1 | 0 | 127.0.0.1 | 0.300 | 3 | 7 | +------------+----+-----------+-----------------+-----------------+------------------+ | wg2 | 0 | 127.0.0.1 | 0.400 | 4 | 8 | +------------+----+-----------+-----------------+-----------------+------------------+查看独占与共享资源组的线程信息
查询执行主要涉及三个线程池:pip_exec、pip_scan和pip_con_scan。
- Exclusive Resource Group运行在专属线程池中,并绑定到分配给它的 Exclusive Cores。
- Shared Resource Group运行在共享线程池中,并绑定到剩余的 Shared Cores。
这三个线程池中的线程命名遵循{ pip_exec | pip_scan | pip_con_scan }_{ com | <resource_group_id> }规则,其中com表示共享线程池,<resource_group_id>表示独占资源组的 ID。
可通过系统视图information_schema.be_threads查看每个 BE 线程绑定的 CPU 信息,其中BE_ID、NAME、BOUND_CPUS分别表示 BE 的 ID、线程名与绑定的 CPU 核数:
select * from information_schema.be_threads where name like '%pip_exec%'; select * from information_schema.be_threads where name like '%pip_scan%'; select * from information_schema.be_threads where name like '%pip_con_scan%';示例:
select BE_ID, NAME, FINISHED_TASKS, BOUND_CPUS from information_schema.be_threads where name like '%pip_exec_com%' and be_id = 10223; +-------+--------------+----------------+------------+ | BE_ID | NAME | FINISHED_TASKS | BOUND_CPUS | +-------+--------------+----------------+------------+ | 10223 | pip_exec_com | 2091295 | 10 | | 10223 | pip_exec_com | 2088025 | 10 | | 10223 | pip_exec_com | 1637603 | 6 | | 10223 | pip_exec_com | 1641260 | 6 | | 10223 | pip_exec_com | 1634197 | 6 | | 10223 | pip_exec_com | 1633804 | 6 | | 10223 | pip_exec_com | 1638184 | 6 | | 10223 | pip_exec_com | 1636374 | 6 | | 10223 | pip_exec_com | 2095951 | 10 | | 10223 | pip_exec_com | 2095248 | 10 | | 10223 | pip_exec_com | 2098745 | 10 | | 10223 | pip_exec_com | 2085338 | 10 | | 10223 | pip_exec_com | 2101221 | 10 | | 10223 | pip_exec_com | 2093901 | 10 | | 10223 | pip_exec_com | 2092364 | 10 | | 10223 | pip_exec_com | 2091366 | 10 | +-------+--------------+----------------+------------+源码视角:资源组在 BE 端如何生效
从源码结构看,资源组的运行时实现集中在 BE 端的be/src/compute_env/workgroup/目录与 FE 端的com.starrocks.catalog.ResourceGroup*类中:
- 定义与调度状态:work_group.h 定义了
WorkGroup及其调度实体WorkGroupSchedEntity/WorkGroupSchedState。其中WorkGroupSchedState通过维护vruntime(虚拟运行时间)实现按权重的公平调度:runtime_ns = vruntime_ns * cpu_weight,调度器据此决定各资源组任务的执行顺序与 CPU 份额,这正对应前文cpu_weight的“相对份额”语义。 - 内存阈值换算:work_group.cpp 在构造
WorkGroup时执行_spill_mem_limit_bytes = _spill_mem_limit_threshold * _memory_limit_bytes,将spill_mem_limit_threshold百分比换算为字节级阈值;同时从 thrift 对象twg中读取spill_mem_limit_threshold等字段完成参数装载。 - 大查询统计:
WorkGroupQueryStats在运行时累计cpu_runtime_ns与scan_rows,用于对big_query_cpu_second_limit/big_query_scan_rows_limit/big_query_mem_limit的实时判定与超限终止。 - CPU 硬隔离与线程池绑定:pipeline_executor_set_manager.h 负责为独占资源组创建专属执行器集合并绑定 Exclusive Cores,同时通过
enable_resource_group_cpu_borrowing与borrowed_cpuids机制支持共享组在空闲时借用独占核,并在属主任务到达时让位。 - FE 端参数与兼容:ResourceGroup.java 定义了全部参数常量(
cpu_weight、cpu_weight_percent、exclusive_cpu_cores、exclusive_cpu_percent、spill_mem_limit_threshold、mem_used_pct_limit等)与内置组default_wg/default_mv_wg,并兼容 v3.3.5 前的short_query类型自动转换;ResourceGroupClassifier.java 则实现了 classifier 匹配度(weight())的计算。
相关参考
- 资源组 SQL 语句参考:CREATE_RESOURCE_GROUP.md、ALTER_RESOURCE_GROUP.md、DROP_RESOURCE_GROUP.md、SHOW_RESOURCE_GROUP.md、SHOW_USAGE_RESOURCE_GROUPS.md
- 相邻主题:查询队列 Query Queues、落盘 Spill to Disk、内存管理 Memory Management、监控与告警
【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考