掃描并發控制
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,取值范圍為[ 開啟動態調整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掃描并發數的最小值之和超過節點的掃描并發額度時,會導致實際并發數超過設定的節點并發額度。