资源隔离故障排查
本主题提供了一些关于资源隔离的常见问题解答。
资源组
在资源组中必须配置哪些资源?
必须配置 CPU 资源限制。您必须设置 cpu_weight 或 exclusive_cpu_core,且值必须大于 0。
StarRocks 是否支持硬资源限制?
是的。StarRocks 支持内存的硬限制。从 v3.3.5 开始,StarRocks 支持通过 exclusive_cpu_cores 对 CPU 进行硬限制。
CPU 在资源组之间如何分配?
当多个资源组同时运行查询时,CPU 使用率与每个组的 cpu_core_limit 成比例。如果普通组在一个调度周期内超过了 BE vCPU cores - short_query.cpu_core_limit,则在该周期内不会进一步调度。
short_query 资源组的资源如何计算?
当 short_query 资源组有正在运行的查询时,所有普通组的 CPU 限制变为 BE vCPU cores − short_query.cpu_core_limit。如果 short_query 资源组空闲,其资源可以被普通组使用。
没有匹配资源组的查询如何处理?
它们使用默认资源组 default_wg,其资源限制和属性如下:
cpu_core_limit= vCPU coresmem_limit= 100%type=normal
如果资源组 rg3 没有查询,所有资源都分配给资源组 rg1 和 rg2,当 rg3 接收到一个大查询时,这些资源会重新分配吗?
会的。回收逐渐发生,并在几十毫秒到几秒内稳定。
分类器的作用是什么?如果没有分类器匹配,或者两个分类器重叠怎么办?
如果没有分类器匹配,查询将回退到默认资源组 default_wg。分类器有权重;如果一个查询匹配多个分类器,将选择权重最高的。
为什么资源组需要 mem_limit,如果 BE 默认使用 90% 的内存?
mem_limit 在资源组级别限制内存。它仅适用于匹配该资源组的查询。
如果资源组的 query_type 设置为 insert,INSERT INTO SELECT 仅限制 INSERT 还是也限制 SELECT?
仅 SELECT 部分受资源组限制。INSERT 操作不受限制。
如果资源组的 mem_limit 设置为 20%,可用内存是否计算为 BE_memory * 90% * 20%?如果有多个资源组,总 mem_limit 超过 100% 怎么办?
各组的总 mem_limit 可以超过 100%。但如果查询超过其资源组限制,将会失败。
如何验证资源组是否应用于查询?
检查 fe.audit.log 或运行 EXPLAIN VERBOSE <SQL> 查看匹配的资源组。
资源组是按集群定义还是按 BE 节点定义?
资源在每个 BE 节点上划分,资源组配置适用于集群中的所有 BE 节点。
如何检查资源组使用情况或监控指标?
使用 FE/BE 指标端点查看特定的资源组相关指标。
-
对于 FE,从
fe_host:8030/metrics?type=json收集以下指标:starrocks_fe_query_resource_group:在此资源组中历史运行的查询数量(包括当前正在运行的)。starrocks_fe_query_resource_group_latency:此资源组的查询延迟百分位数。标签类型指示特定百分位数,包括mean、75_quantile、95_quantile、98_quantile、99_quantile、999_quantile。starrocks_fe_query_resource_group_err:在此资源组中遇到错误的查询数量。
-
对于 BE,从
be_host:8040/metrics?type=json收集以下指标:starrocks_be_resource_group_cpu_limit_ratio:此资源组的cpu_core_limit与所有资源组的总cpu_core_limit的比率。starrocks_be_resource_group_mem_limit_bytes:此资源组的内存限制。
short_query 和普通资源组有什么区别?我可以创建多个 short_query 资源组吗?
只允许一个 short_query 资源组。当 short_query 资源组中有查询运行时,它使用实际的 BE 核心,而普通组按比例共享剩余资源。
StarRocks 是否提供查询优先级或基于大查询的优先级?
没有优先级系统。当查询超过任何配置的资源阈值时,它就成为“大查询”。
资源组属于特定的 BE 节点还是运行查询的 BE?
资源组在集群中的所有 BEs 上统一应用。
我应该如何配置 concurrency_limit?
这取决于查询的复杂性、集群大小和工作负载模式。
基于分类器的匹配如何工作?它是否与用户和/或数据库相关?
匹配取决于分类器属性,如 IP、用户、数据库、角色或 query_type。
如何通 过会话变量指定资源组?
您可以将其设置为变量:
SET resource_group = '<resource_group_name>';
或通过提示在查询中指定:
SELECT /*+ SET_VAR(SET resource_group = '<resource_group_name>') */ * FROM tbl;
并发控制是全局生效、按用户生效还是按 BE 生效?
concurrency_limit 限制每个资源组的并发性,而 pipeline_dop 控制单个 Pipeline Instance 的并行度。
内存限制是全局生效、按用户生效还是按 BE 生效?
mem_limit 应用于每个 BE 的资源组。每个 Instance 的内存由 exec_mem_limit 控制。
并发和内存限制仅在启用资源组时有效吗?
并发仅由资源组控制。查询并行度由会话变量如 pipeline_dop 控制。
如果 query_type 设置为 INSERT,CTAS 任务会匹配资源组吗?
会的。资源组将限制 CTAS 任务的 SELECT 部分的资源。如果 SELECT 部分超过阈值,大查询限制也将生效。
为什么 short_query 资源组中的查询不能消耗所有 CPU?
short_query 资源组必须至少留出 1 个 CPU 核心给普通组。
没有查询队列和资源组,是否限制并发查询?
不限制。过载会导致查询超时或内存限制错误。