全部產品
Search
文件中心

AnalyticDB:使用Resource Queue(資源隊列)進行負載管理

更新時間:Mar 19, 2025

使用Resource Queue可以對AnalyticDB for PostgreSQL的系統資源進行管理或隔離。本文將介紹如何在AnalyticDB for PostgreSQL中建立和使用Resource Queue。

Resource Queue介紹

資料庫執行個體的CPU和記憶體資源是有限的,這些資源對查詢效能有直接影響。當資料庫負載達到一定程度時,各個查詢會競爭這些資源,從而導致整體查詢效能下降。對於延遲敏感的業務來說,這種效能下降是無法容忍的。

AnalyticDB for PostgreSQL提供了系統資源負載管理工具Resource Queue。通過該工具,您可以根據業務需求設定資料庫的並發查詢數、每個查詢的記憶體大小以及可用的CPU資源。這樣可以確保在執行查詢時,系統資源按預期分配,從而保證查詢效能符合預期。

許可權要求

建立和使用Resource Queue需要使用初始帳號高許可權使用者RDS_SUPERUSER

建立Resource Queue

建立Resource Queue文法如下。

CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ... ])

其中queue_attribute為Resource Queue的屬性,可以取如下值:

    ACTIVE_STATEMENTS=integer
        [ MAX_COST=float [COST_OVERCOMMIT={TRUE|FALSE}] ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]

    MAX_COST=float [ COST_OVERCOMMIT={TRUE|FALSE} ]
        [ ACTIVE_STATEMENTS=integer ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]

參數

描述

ACTIVE_STATEMENTS

用於指定Resource Queue在某個時間點最多的活躍查詢(正在執行的查詢)數量。

MEMORY_LIMIT

用於指定在單個計算節點(segment)上Resource Queue所有查詢最多可以使用的記憶體。

  • 單位可以為KB、MB、GB。

  • 預設值為-1,表示沒有限制。

MAX_COST

用於指定Resource Queue查詢代價的最大值,預設值為-1,表示沒有限制。

說明

這裡的查詢代價是指AnalyticDB for PostgreSQL最佳化器估算出來的查詢代價。

COST_OVERCOMMIT

該參數需要設定MAX_COST參數。

  • 當COST_OVERCOMMIT為true,查詢代價大於MAX_COST的查詢可以在系統閒置時候執行。

  • 當COST_OVERCOMMIT為false,查詢代價大於MAX_COST的查詢將會被拒絕執行。

MIN_COST

用於指定Resource Queue最小的查詢代價,當查詢代價小於MIN_COST的查詢,將不會排隊等待而是會立即被執行。

PRIORITY

用於指定Resource Queue的優先順序,優先順序高的查詢將會被分配更多的CPU資源用於執行,取值如下。

  • MIN

  • LOW

  • MEDIUM(預設值)

  • HIGH

  • MAX

說明

建立Resource Queue時,ACTIVE_STATEMENTSMAX_COST兩個屬性中必須指定一個,否則建立無法成功。

CREATE RESOURCE QUEUE adhoc2 WITH (MEMORY_LIMIT='2000MB');
ERROR:  at least one threshold ("ACTIVE_STATEMENTS", "MAX_COST") must be specified
  • 指定並發查詢數量

    在建立Resource Queue時,使用如下文法指定Resource Queue裡使用者可以並發執行的查詢數量。

    CREATE RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=3);

    這裡建立了一個名為adhoc的Resource Queue,這個Resource Queue的使用者在指定時間點,最多執行3個查詢操作。如果此時隊列中執行的查詢數量為3個,同時有新的查詢進入,那麼新的查詢將會處於等待狀態,直到前面的查詢執行完畢。

  • 指定使用的記憶體上限。

    在建立Resource Queue時,使用如下文法指定Resource Queue裡查詢使用的記憶體上限。

    CREATE RESOURCE QUEUE myqueue WITH (ACTIVE_STATEMENTS=20, MEMORY_LIMIT='2000MB');

    這裡建立了一個名為myqueue的Resource Queue,在這個Resource Queue中,所有查詢最多能用2000MB的記憶體。執行查詢時,會在計算節點(segment)佔用MEMORY_LIMITACTIVE_STATEMENTS的記憶體,對於myqueue來說每個查詢會佔用2000MB/20=100MB的記憶體。如果查詢需要單獨可用記憶體,可以使用系統參數statement_mem來設定,但是需要保證不超過Resource Queue設定的MEMORY_LIMIT和系統參數max_statement_mem。樣本如下:

    SET statement_mem='1GB';
    SELECT * FROM test_adbpg WHERE col='adb4pg' ORDER BY id;
    RESET statement_mem;
  • 設定隊列優先順序。

    給不同的Resource Queue設定優先權可以控制Resource Queue中的查詢對CPU資源的使用。例如,系統中有大規模並發查詢時,高優先順序Resource Queue中的查詢會比低優先順序Resource Queue中的查詢使用更多的CPU資源,從而保證高優先順序的查詢有更充分的CPU資源來執行。

    Resource Queue優先順序的設定可以在建立時設定,樣本如下:

    CREATE RESOURCE QUEUE executive WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);

    Resource Queue優先順序也可以在建立完成之後進行修改,具體操作請參見修改Resource Queue的配置

    說明

    優先順序與ACTIVE_STATEMENTS/MEMORY_LIMIT的區別:

    • ACTIVE_STATEMENTS/MEMORY_LIMIT會在查詢執行之前判斷其是否允許被執行。

    • 優先順序機制是在一個查詢開始執行後,根據系統的運行狀態以及其所在隊列的優先順序,動態地給這個對應的查詢分配可用的CPU資源。

    例如,AnalyticDB for PostgreSQL正在執行一些低優先順序的查詢時,有一個高優先順序的查詢進入並準備執行。那麼AnalyticDB for PostgreSQL會為這個查詢分配更多的CPU資源,並減少低優先順序查詢的CPU資源。CPU資源分派的規則如下:

    • 相同優先順序的查詢所能被分配到的CPU資源一致。

    • 當系統中同時有高、中、低三個優先順序別的查詢的時候,高優先順序的查詢會分配得到系統90%的CPU資源,剩下的10%會留給中和低優先順序的查詢分配,在這10%的系統CPU資源中,中優先順序的查詢會得到其中90%的CPU資源,低優先順序查詢則得到剩餘的10%。

Resource Queue被建立完畢之後,可以在pg_resqueue中查看限制設定和當前資源隊列的狀態。

SELECT * FROM pg_resqueue WHERE rsqname='adhoc';

Resource Queue的建立不能在事務塊內進行,如下所示:

BEGIN
CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);
ERROR:  CREATE RESOURCE QUEUE cannot run inside a transaction block
說明

並非所有的SQL都會受到Resource Queue的限制:

  • 當resource_select_only為on,SELECTSELECT INTOCREATE TABLE AS SELECTDECLARE CURSOR會受到約束。

  • resource_select_only為off,INSERTUPDATEDELETE也會被資源隊列管理起來。

  • AnalyticDB for PostgreSQL中,resource_select_only預設為off。

分配使用者到Resource Queue

建立Resource Queue完成後,需要將一個或多個使用者指派給這個Resource Queue,完成分配後Resource Queue就會對隊列中使用者的查詢進行資源管理。

說明
  • 如果某個使用者沒有分配到Resource Queue,AnalyticDB for PostgreSQL會將該使用者指派給pg_default資源隊列。

  • pg_default可以同時運行500個活躍的查詢語句,沒有cost limit的限制,優先順序為MEDIUM。

將使用者指派給指定Resource Queue,文法如下:

ALTER ROLE name RESOURCE QUEUE queue_name;
CREATE ROLE name WITH LOGIN RESOURCE QUEUE queue_name;

您可以在使用者建立之後修改其所屬的Resource Queue,也可以在使用者建立之時為其指定Resource Queue。

說明

在任意時刻一個使用者只能歸屬於一個Resource Queue。

刪除Resource Queue中的使用者

使用如下文法移除某個role指定的Resource Queue。

ALTER ROLE role_name RESOURCE QUEUE none;

修改Resource Queue的配置

您可以使用如下語句對Resource Queue的資源配置進行修改。

  • 修改活躍的查詢數。

    ALTER RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=5);
  • 修改Resource Queue記憶體和查詢代價約束。

    ALTER RESOURCE QUEUE adhoc WITH (MAX_COST=-1.0, MEMORY_LIMIT='2GB');
  • 修改Resource Queue優先順序。

    ALTER RESOURCE QUEUE adhoc WITH (PRIORITY=LOW);
    ALTER RESOURCE QUEUE reporting WITH (PRIORITY=HIGH);

刪除Resource Queue

您可以使用如下語句刪除Resource Queue。

DROP RESOURCE QUEUE name;
說明

刪除Resource Queue前請檢查如下專案,否則會導致刪除失敗:

  • Resource Queue沒有被指派的使用者。

  • Resource Queue中沒有任何查詢處於waiting狀態。

常見報錯

ERROR: must be superuser to alter resource queues

報錯原因:帳號許可權不足。建立和管理Resource Queue需要使用初始帳號或高許可權帳號RDS_SUPERUSER。

解決辦法:請使用初始帳號或高許可權帳號RDS_SUPERUSER操作,或者請初始帳號或高許可權帳號為您使用的帳號授予RDS_SUPERUSER角色。

ALTER ROLE role_name WITH RDS_SUPERUSER;