使用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所有查詢最多可以使用的記憶體。
|
MAX_COST | 用於指定Resource Queue查詢代價的最大值,預設值為-1,表示沒有限制。 說明 這裡的查詢代價是指AnalyticDB for PostgreSQL最佳化器估算出來的查詢代價。 |
COST_OVERCOMMIT | 該參數需要設定MAX_COST參數。
|
MIN_COST | 用於指定Resource Queue最小的查詢代價,當查詢代價小於MIN_COST的查詢,將不會排隊等待而是會立即被執行。 |
PRIORITY | 用於指定Resource Queue的優先順序,優先順序高的查詢將會被分配更多的CPU資源用於執行,取值如下。
|
建立Resource Queue時,ACTIVE_STATEMENTS和MAX_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_LIMIT或ACTIVE_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,
SELECT、SELECT INTO、CREATE TABLE AS SELECT、DECLARE CURSOR會受到約束。當
resource_select_only為off,INSERT、UPDATE、DELETE也會被資源隊列管理起來。在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;