扫描并发控制

更新时间:

AnalyticDB for MySQL支持配置扫描并发额度,可避免因查询的扫描并发过大、占用过多资源,导致节点不稳定的情况。本文为您介绍如何开启扫描并发控制功能和配置扫描并发额度。

前提条件

集群内核版本需为3.1.10.0及以上版本。

说明 如何查看集群内核版本,请参见如何查看实例版本信息。如需升级内核版本,请联系技术支持。

背景信息

AnalyticDB for MySQL在执行查询时,需要从数据源扫描数据,扫描任务会被调度到存储节点或计算节点上执行,节点的扫描任务并发数过大,可能会造成以下问题:

  • 内表的扫描任务并发数过大会导致存储节点IO争抢严重,CPU和内存使用率增加,导致存储节点不稳定。

  • 外表的扫描效率受数据源的限制,当扫描任务并发数超过限制后,增加扫描任务并发数并不会加快扫描速度,反而会占用计算节点的资源,影响其他查询。

为解决以上问题,AnalyticDB for MySQL推出了扫描并发控制功能,该功能默认开启。

基本概念

Task

AnalyticDB for MySQL中,查询会被切分成多个Stage,Stage会调度到多个节点上执行,每个执行的子任务称为一个Task。

Split

AnalyticDB for MySQL中,对一张表的扫描会被拆分为多个数据片(Split)的扫描,Split会被调度到某个Task上,由Task执行该Split的扫描任务。一个Task中可以有多个Split扫描任务。

功能介绍

每个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,取值范围为[1,TARGET_RUNNING_SPLITS_LIMIT_PER_TASK]

开启动态调整Task扫描并发功能后,当节点上运行的扫描并发数较高时,节点会动态降低Task的扫描并发额度,最小不低于该值。

TARGET_RUNNING_SPLITS_LIMIT_PER_TASK

Task扫描并发额度的中间值,基于该值增加或降低扫描并发额度。默认值为32,取值范围为[MIN_RUNNING_SPLITS_LIMIT_PER_TASK,MAX_RUNNING_SPLITS_LIMIT_PER_TASK]。

当节点上运行的所有Task的扫描并发数的中间值之和小于节点并发额度时,节点会动态增加Task扫描并发额度;反之会动态降低Task扫描并发额度。

MAX_RUNNING_SPLITS_LIMIT_PER_TASK

Task扫描并发额度的最大值。默认值为64,取值范围大于TARGET_RUNNING_SPLITS_LIMIT_PER_TASK值。

开启动态调整Task扫描并发功能后,当节点上运行的扫描并发数较低时,节点会动态增加Task的扫描并发额度,且最大不高于该值。

Task扫描并发额度的调整建议

AnalyticDB for MySQL支持对不同的查询配置不同的扫描并发额度,从而将有限的资源按照不同要求在不同Task之间分配。例如:

  • 查询RT小,扫描量小的查询(例如:点查场景):您可以将MIN_RUNNING_SPLITS_LIMIT_PER_TASKTARGET_RUNNING_SPLITS_LIMIT_PER_TASKMAX_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扫描并发数的最小值之和超过节点的扫描并发额度时,会导致实际并发数超过设定的节点并发额度。