Interactive型资源组的优先级队列与并发控制
为了更细致地控制查询并发数,AnalyticDB MySQL版湖仓版(3.0)和数仓版(3.0)的资源组提供了优先级队列的能力。每个资源组都有自己的一组优先级队列,包括LOWEST队列、LOW队列、NORMAL队列和HIGH队列。您可以设置查询的优先级,使不同查询进入不同的优先级队列,并通过修改队列并发数来对查询进行限流或放大并发。本文介绍如何设置查询的优先级,以及如何设置队列的并发数。
前提条件
集群内核版本为3.1.6.3及以上版本。
功能概述
每个资源组都有一组查询优先级队列。一组查询优先级队列包含四个队列,分别为LOWEST队列、LOW队列、NORMAL队列和HIGH队列。默认情况下,普通SELECT查询进入NORMAL队列,其他ETL查询(例如INSERT INTO SELECT
、DELETE SELECT
、INSERT OVERWRITE INTO SELECT
),会进入LOWEST队列。同时,您可以设置查询的优先级,使不同查询进入不同的优先级队列。同一队列内部,优先级高的查询会优先运行。各队列的优先级范围如图所示:
每个查询优先级队列都可设置最大可运行查询数和最大排队查询数。
当查询优先级队列里正在执行的查询数量≥最大可运行查询数时,新的查询将进入排队状态。
当查询优先级队列里排队状态的查询数量≥最大可排队查询数+最大可运行查询数时,新的查询将直接被拒绝。
当正在执行的查询结束时,如果有排队状态的查询,优先级高的查询优先执行,同优先级查询以FIFO方式从排队状态的查询中取下一个查询进入执行状态。
开启查询优先级
内核版本为3.1.8.2及以上版本的AnalyticDB MySQL集群默认开启查询优先级。
内核版本为3.1.6.3~3.1.8.2(不包含3.1.8.2)版本,需执行下方语句,开启查询优先级。
SET ADB_CONFIG XIHE_ENV_QUERY_PRIORITY_QUEUE_ENABLE=true;
设置查询优先级
默认情况下,ELT查询的优先级为LOWEST(对应取值为5),普通查询(SELECT)的优先级为NORMAL(对应取值为25)。如果需要提高或降级查询的优先级,可参考下文设置查询的优先级。
注意事项
INSERT INTO ... VALUES(...)
语句不支持设置查询优先级。
设置方法
(推荐)通过Workload Manager自动添加HINT。详细信息,请参见查询优先级。
手动添加以下HINT语句,配置查询优先级。
/*query_priority=<优先级取值>*/ select_statement
优先级取值说明:取值可以为整数,范围为0~39。数值越大优先级越高。取值也可以为字符串,包括LOWEST、LOW、NORMAL、HIGH,分别对应的整数为5、15、25、35。
示例
设置优先级为HIGH,使查询进入HIGH队列。
/*query_priority=HIGH*/ SELECT * FROM test_table;
设置优先级为35,使查询进入HIGH队列。
/*query_priority=35*/ SELECT * FROM test_table;
设置队列并发
优先级队列的并发设置分为全局设置和资源组设置。
设置方法
设置全局的优先级队列并发:
SET ADB_CONFIG <并发参数> = <取值>
。设置资源组的优先级队列并发:
SET ADB_CONFIG <资源组名称>.<并发参数> = <取值>
。重要仅数仓版(3.0)弹性模式集群(32核及以上)和湖仓版(3.0)集群支持设置资源组的优先级队列并发数。
并发参数列表
查询优先级队列的参数取值代表单个前端节点的队列大小,不是集群的队列总大小。集群的队列总大小等于单个队列乘以前端节点个数,即集群的队列总大小=单个队列×前端节点个数。
查询优先级队列的参数配置对全局前端节点同时生效。
前端节点即FrontNode,更多详细信息,请参见接入层高可用。
队列名 | 配置参数 | 默认值 | 说明(对单个资源组) |
LOWEST(ETL) 队列 | XIHE_ENV_QUERY_ETL_MAX_CONCURRENT_SIZE | 20 | 单个前端节点LOWEST队列的最大可运行查询数为20。 |
XIHE_ENV_QUERY_ETL_MAX_QUEUED_SIZE | 200 | 单个前端节点LOWEST队列的最大可排队查询数为200。 | |
LOW队列 | XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE | 20 | 单个前端节点LOW队列的最大可运行查询数为20。 |
XIHE_ENV_QUERY_LOW_PRIORITY_MAX_QUEUED_SIZE | 200 | 单个前端节点LOW队列的最大可排队查询数为200。 | |
NORMAL队列 | XIHE_ENV_QUERY_NORMAL_MAX_CONCURRENT_SIZE | 20 | 单个前端节点NORMAL队列的最大可运行查询数为20。 |
XIHE_ENV_QUERY_NORMAL_MAX_QUEUED_SIZE | 200 | 单个前端节点NORMAL队列的最大可排队查询数为200。 | |
HIGH队列 | XIHE_ENV_QUERY_HIGH_MAX_CONCURRENT_SIZE | 40 | 单个前端节点HIGH队列的最大可运行查询数为40。 |
XIHE_ENV_QUERY_HIGH_MAX_QUEUED_SIZE | 400 | 单个前端节点HIGH队列的最大可排队查询数为400。 |
示例
修改集群的LOW队列最大可运行查询数为5。
SET ADB_CONFIG XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE = 5;
修改rg1资源组的LOW队列最大可运行查询数为5。
SET ADB_CONFIG rg1.XIHE_ENV_QUERY_LOW_PRIORITY_MAX_CONCURRENT_SIZE = 5;
查看队列并发
查看全局的最大可运行查询数和最大排队查询数:
SHOW ADB_CONFIG KEY=<并发参数>;
。查看某个资源组的最大可运行查询数和最大排队查询数:
SHOW ADB_CONFIG KEY=<资源组名称>.<并发参数>;
。