使用Resource Queue(資源隊列)進行負載管理
使用Resource Queue可以對云原生數據倉庫PostgreSQL版的系統資源進行管理或隔離,本文將介紹如何在云原生數據倉庫PostgreSQL版中創建和使用Resource Queue。
Resource Queue介紹
一個數據庫實例的CPU資源和內存資源是有限的,這些資源影響著數據庫的查詢性能,當數據庫負載達到一定程度,各個查詢會競爭CPU資源和內存資源,造成整體的查詢性能低下。對于那些延遲敏感的業務,是不可忍受的情況。
云原生數據倉庫PostgreSQL版提供了系統資源負載管理工具——Resource Queue。您可以根據自身業務的情況,指定數據庫可運行的并發查詢數、每個查詢可以使用的內存大小、以及可使用的CPU資源。這樣可以保證執行查詢時有預期的系統資源,從而得到符合預期的查詢性能。
創建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,表示沒有限制。 說明 Resource Queue查詢代價是由系統的優化器自行計算得出,需要您充分了解目標SQL的代價的情況下修改MAX_COST參數。 通常情況下,不建議您直接修改MAX_COST參數,建議通過MEMORY_LIMIT 和ACTIVE_STATEMENTS參數控制查詢代價。 |
COST_OVERCOMMIT | 該參數需要設置MAX_COST參數。
|
MIN_COST | 用于指定Resource Queue最小的查詢代價,當查詢代價小于MIN_COST的查詢,將不會排隊等待而是會立即被執行。 |
PRIORITY | 用于指定Resource Queue的優先級,優先級高的查詢將會被分配更多的CPU資源用于執行。
默認值為MEDIUM。 |
創建Resource Queue時,ACTIVE_STATEMENTS
和MAX_COST
兩個屬性中必須指定一個,否則創建無法成功。
postgres=> 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資源。
例如,云原生數據倉庫PostgreSQL版在執行一些低優先級的查詢,然后一個高優先級的查詢進入并準備執行。那么云原生數據倉庫PostgreSQL版會為這個查詢分配更多的CPU資源,并減少低優先級查詢的CPU資源。CPU資源分配的規則如下:
相同優先級的查詢所能被分配到的CPU資源一致。
當系統中同時有高、中、低三個優先級別的查詢的時候,高優先級的查詢會分配得到系統90%的CPU資源,剩下的10%會留給中和低優先級的查詢去分配,在這10%的系統CPU資源中,中優先級的查詢會得到其中90%的CPU資源,低優先級查詢則得到剩余的10%。
Resource Queue被創建完畢之后,可以使用gp_toolkit.gp_resqueue_status
系統視圖查看限制設置和當前資源隊列的狀態,如下所示:
postgres=> SELECT * FROM gp_toolkit.gp_resqueue_status WHERE
postgres-> rsqname='adhoc';
queueid | rsqname | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders
---------+---------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------
19283 | adhoc | 3 | 0 | -1 | 0 | -1 | 0 | 0 | 0
(1 行記錄)
Resource Queue的創建不能在事務塊內進行,如下所示:
postgres=> BEGIN;
BEGIN
postgres=> 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也會被資源隊列管理起來。
在云原生數據倉庫PostgreSQL版中,resource_select_only默認為off。
分配用戶到Resource Queue
創建Resource Queue完成后,需要將一個或多個用戶分配給這個Resource Queue,完成分配后Resource Queue就會對隊列中用戶的查詢進行資源管理。
如果某個用戶沒有分配到Resource Queue,云原生數據倉庫PostgreSQL版會將該用戶分配給pg_default資源隊列。
pg_default隊列的活躍并發數(rsqcountlimit)及其他配置可以通過以下SQL查詢。
postgres=> SELECT * FROM gp_toolkit.gp_resqueue_status WHERE rsqname='pg_default';
將用戶分配給指定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狀態。