全部產品
Search
文件中心

AnalyticDB:掃描並發控制

更新時間:Jul 06, 2024

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