StarRocks Resource Group 资源组深度指南:在同一集群中隔离 CPU 与内存、混合运行多类工作负载
2026/9/16 20:02:44 网站建设 项目流程

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 TableExternal TableBig Query RestrictionINSERT INTOBroker LoadRoutine Load / Stream Load / Schema ChangeCPU 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约束。Stringdefault_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_v2false时可用。[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_wgdefault_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_typeinsert的资源组时,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_weightcpu_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_weightcpu_weight_percentexclusive_cpu_coresexclusive_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_coresexclusive_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_corescpu_weight_percentexclusive_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_modeauto)但未启用资源组时:当查询内存使用超过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_queuetrue;它仅在 FE 配置项enable_query_queue_v2false时可用。

大查询资源参数

以下参数用于为大型查询单独配置资源上限,均在大于 0 时生效,默认 0:

  • big_query_cpu_second_limit:大查询任务在每个 BE 节点上可用的最大 CPU 时间(秒),并行任务的真实 CPU 时间累加计算。
  • big_query_scan_rows_limit:大查询任务在每个 BE 节点上可扫描的最大行数。
  • big_query_mem_limit:大查询任务在每个 BE 节点上可使用的最大内存(字节)。

注意当资源组中的查询超过上述大查询限制时,查询会被终止并报错。你也可以在 FE 节点fe.audit.logErrorCode列查看错误信息。

BE 端为每个资源组维护了WorkGroupQueryStatscpu_runtime_nsscan_rowsscan_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_wgdefault_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表示匹配度。

如需查看资源组的全部字段(含已废弃字段,如typemax_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_groupCountInstantaneous该资源组历史运行的查询数(含当前运行中)。
starrocks_fe_query_resource_group_latencymsInstantaneous该资源组的查询延迟百分位。标签type表示具体百分位,包括mean75_quantile95_quantile98_quantile99_quantile999_quantile
starrocks_fe_query_resource_group_errCountInstantaneous该资源组中发生错误的查询数。
starrocks_fe_resource_group_query_queue_totalCountInstantaneous该资源组历史排队查询总数(含当前运行中)。v3.1.4 起支持,仅在启用查询队列时有效。
starrocks_fe_resource_group_query_queue_pendingCountInstantaneous该资源组当前队列中的查询数。v3.1.4 起支持,仅在启用查询队列时有效。
starrocks_fe_resource_group_query_queue_timeoutCountInstantaneous该资源组中在队列中等待超时的查询数。v3.1.4 起支持,仅在启用查询队列时有效。
BE 指标
Metric单位类型说明
resource_group_running_queriesCountInstantaneous该资源组当前正在运行的查询数。
resource_group_total_queriesCountInstantaneous该资源组历史运行的查询数(含当前运行中)。
resource_group_bigquery_countCountInstantaneous该资源组中触发大查询限制的查询数。
resource_group_concurrency_overflow_countCountInstantaneous该资源组中触发concurrency_limit限制的查询数。
resource_group_mem_limit_bytesBytesInstantaneous该资源组的内存上限。
resource_group_mem_inuse_bytesBytesInstantaneous该资源组当前已使用的内存。
resource_group_cpu_limit_ratioPercentageInstantaneous该资源组的cpu_core_limit占所有资源组cpu_core_limit总和的比例。
resource_group_inuse_cpu_coresCountAverage该资源组当前使用的 CPU 核数估计值(近似值,为相邻两次指标采集统计的平均值)。v3.1.4 起支持。
resource_group_cpu_use_ratioPercentageAverage已废弃该资源组使用的 Pipeline 线程时间片占所有资源组 Pipeline 线程时间片总数的比例(相邻两次采集的平均值)。
resource_group_connector_scan_use_ratioPercentageAverage已废弃该资源组使用的外表 Scan 线程时间片占所有资源组 Pipeline 线程时间片总数的比例(相邻两次采集的平均值)。
resource_group_scan_use_ratioPercentageAverage已废弃该资源组使用的内表 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_execpip_scanpip_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_IDNAMEBOUND_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_nsscan_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_borrowingborrowed_cpuids机制支持共享组在空闲时借用独占核,并在属主任务到达时让位。
  • FE 端参数与兼容:ResourceGroup.java 定义了全部参数常量(cpu_weightcpu_weight_percentexclusive_cpu_coresexclusive_cpu_percentspill_mem_limit_thresholdmem_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询