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掃描並發數的最小值之和超過節點的掃描並發額度時,會導致實際並發數超過設定的節點並發額度。