日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用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所有查詢最多可以使用的內存。

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

  • 默認值為-1,表示沒有限制。

MAX_COST

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

說明

Resource Queue查詢代價是由系統的優化器自行計算得出,需要您充分了解目標SQL的代價的情況下修改MAX_COST參數。

通常情況下,不建議您直接修改MAX_COST參數,建議通過MEMORY_LIMIT 和ACTIVE_STATEMENTS參數控制查詢代價。

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

默認值為MEDIUM。

說明

創建Resource Queue時,ACTIVE_STATEMENTSMAX_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狀態。