AnalyticDB for MySQL支持配置扫描并发额度,可避免因查询的扫描并发过大、占用过多资源,导致节点不稳定的情况。本文为您介绍如何开启扫描并发控制功能和配置扫描并发额度。
前提条件
集群内核版本需为3.1.10.0及以上版本。
背景信息
AnalyticDB for MySQL在执行查询时,需要从数据源扫描数据,扫描任务会被调度到存储节点或计算节点上执行,节点的扫描任务并发数过大,可能会造成以下问题:
内表的扫描任务并发数过大会导致存储节点IO争抢严重,CPU和内存使用率增加,导致存储节点不稳定。
外表的扫描效率受数据源的限制,当扫描任务并发数超过限制后,增加扫描任务并发数并不会加快扫描速度,反而会占用计算节点的资源,影响其他查询。
为解决以上问题,AnalyticDB for MySQL推出了扫描并发控制功能,该功能默认开启。
基本概念
功能介绍
每个Task都有一个扫描并发额度,当Task实际运行的Split扫描并发数小于扫描并发额度时,Task可以启动一个新的Split扫描任务;反之,调度到该Task的Split需要等待已有的扫描任务结束后才可以执行。AnalyticDB for MySQL支持节点的扫描并发控制和Task的扫描并发控制。其中,Task的扫描并发额度可以根据节点整体的扫描并发额度动态调整。
关闭或重新开启扫描并发控制功能
扫描并发控制功能默认开启,您可以通过下列命令关闭或重新开启扫描并发控制功能。
集群级别关闭或重新开启扫描并发控制功能:
SET ADB_CONFIG SPLIT_FLOW_CONTROL_ENABLED=true|false;
查询级别关闭或重新开启扫描并发控制功能:
/*SPLIT_FLOW_CONTROL_ENABLED=true|false*/ SELECT * FROM table;
动态调整Task扫描并发额度
开启和关闭动态调整Task扫描并发功能
未开启动态调整Task扫描并发功能时,Task的扫描并发额度默认值为32,且可以通过SET ADB_CONFIG TARGET_RUNNING_SPLITS_LIMIT_PER_TASK=<value>;
调整默认值。
您也可以开启态调整Task扫描并发功能,根据节点整体的扫描并发额度,动态调整task的扫描并发额度。
SET ADB_CONFIG NODE_LEVEL_SPLIT_FLOW_CONTROL_ENABLED=true|false;
开启动态调整Task扫描并发功能时,需确保已开启扫描并发控制功能。您可以使用SHOW ADB_CONFIG KEY=SPLIT_FLOW_CONTROL_ENABLED;
命令查询是否开启扫描并发控制功能。
调整Task扫描并发额度
调整方法
您可通过SET命令或Hint在集群级别和查询级别调整Task扫描并发额度:
集群级别调整Task扫描并发额度:
SET ADB_CONFIG <Task扫描并发参数>=<value>;
查询级别调整Task扫描并发额度:
/*<Task扫描并发参数>=<value>*/SELECT * FROM orders;
Task扫描并发参数
配置以下参数,动态调整Task的扫描并发额度,参数如下表所示:
参数 | 说明 |
MIN_RUNNING_SPLITS_LIMIT_PER_TASK | Task扫描并发额度的最小值。默认值为1,取值范围为[ 开启动态调整Task扫描并发功能后,当节点上运行的扫描并发数较高时,节点会动态降低Task的扫描并发额度,最小不低于该值。 |
TARGET_RUNNING_SPLITS_LIMIT_PER_TASK | Task扫描并发额度的中间值,基于该值增加或降低扫描并发额度。默认值为32,取值范围为[ 当节点上运行的所有Task的扫描并发数的中间值之和小于节点并发额度时,节点会动态增加Task扫描并发额度;反之会动态降低Task扫描并发额度。 |
MAX_RUNNING_SPLITS_LIMIT_PER_TASK | Task扫描并发额度的最大值。默认值为64,取值范围大于 开启动态调整Task扫描并发功能后,当节点上运行的扫描并发数较低时,节点会动态增加Task的扫描并发额度,且最大不高于该值。 |
Task扫描并发额度的调整建议
AnalyticDB for MySQL支持对不同的查询配置不同的扫描并发额度,从而将有限的资源按照不同要求在不同Task之间分配。例如:
查询RT小,扫描量小的查询(例如:点查场景):您可以将
MIN_RUNNING_SPLITS_LIMIT_PER_TASK
、TARGET_RUNNING_SPLITS_LIMIT_PER_TASK
和MAX_RUNNING_SPLITS_LIMIT_PER_TASK
三个参数都设置为一个很大的值,或直接关闭扫描并发控制功能(即SET ADB_CONFIG SPLIT_FLOW_CONTROL_ENABLED=false;
),确保查询的所有扫描任务均能快速启动。扫描量大,执行优先级不高的查询:您可以将
TARGET_RUNNING_SPLITS_LIMIT_PER_TASK
设置为一个较小的值,在资源紧张时查询只会占用很小的额度,减少对其他重要查询的影响;在资源空闲时也可能动态增加并发数来提升执行效率。外表查询:您可以根据数据源的传输限制等因素设置合适的并发数。
示例
在集群级别将所有Task扫描并发额度的最小值设置为24。
SET ADB_CONFIG MIN_RUNNING_SPLITS_LIMIT_PER_TASK=24;
在查询级别将指定Task扫描任务的并发额度最小值设置为10。
/*MIN_RUNNING_SPLITS_LIMIT_PER_TASK=10*/SELECT * FROM orders;
在集群级别将所有Task扫描并发额度的最大值设置为128。
SET ADB_CONFIG MAX_RUNNING_SPLITS_LIMIT_PER_TASK=128;
在查询级别将指定Task扫描任务的并发额度最大值设置为100。
/*MAX_RUNNING_SPLITS_LIMIT_PER_TASK=100*/SELECT * FROM adb_test;
配置节点的扫描并发额度
存储节点
存储节点的扫描并发额度默认为256,扫描并发额度过大或过小都会影响集群性能,建议您不要修改默认值。命令如下:
SET ADB_CONFIG WORKER_MAX_RUNNING_SOURCE_SPLITS_PER_NODE=256;
计算节点
计算节点的扫描并发额度默认为256,扫描并发额度过大或过小都会影响集群性能,建议您不要修改默认值。命令如下:
SET ADB_CONFIG EXECUTOR_MAX_RUNNING_SOURCE_SPLITS_PER_NODE=256;
您可以使用
SHOW ADB_CONFIG
命令查看节点的扫描并发额度,详情请参见SHOW ADB_CONFIG。设置节点级别的扫描并发额度后,可能不会立即生效。原因如下:
设置节点级别的扫描并发额度后,仅对节点中未运行的扫描任务生效,对当前节点中已运行的扫描任务不会生效。因此,降低扫描并发额度时,需等待已经开始执行的扫描任务执行完成。
扫描并发控制会确保所有Task的扫描并发数大于所设置的最小值。当节点上所有Task扫描并发数的最小值之和超过节点的扫描并发额度时,会导致实际并发数超过设定的节点并发额度。