AnalyticDB for PostgreSQL提供的資源群組管理功能,支援綁定資料庫帳號到資源群組,並為資源群組內的查詢設定最大並發事務數、CPU使用率和記憶體佔比等,可以使資源變得彈性,獲得更高的查詢速度。
版本限制
核心版本為v6.6.1.0及以上的AnalyticDB PostgreSQL 6.0版執行個體,以及核心版本為v7.0.6.3及以上的AnalyticDB PostgreSQL 7.0版執行個體,可以通過控制台直接將資源管理方式切換為資源群組管理。
核心版本為v6.6.1.0以下的AnalyticDB PostgreSQL 6.0版執行個體,以及核心版本為v7.0.6.3以下的AnalyticDB PostgreSQL 7.0版執行個體需要提交工單來將資源管理方式切換為資源群組管理。
如何查看執行個體核心版本,請參見查看核心小版本。
資源群組(Resource Group)簡介
AnalyticDB for PostgreSQL支援使用資源群組(Resource Group)對資料庫進行資源管理,相對於使用資源隊列(Resource Queue)管理資源的方式具有更精細化、管理資源類別更全面的優勢。資源群組管理與資源隊列管理不能同時使用,僅能使用一個,開啟資源群組管理之後資源隊列自動失效。關於資源隊列的更多介紹,請參見使用Resource Queue(資源隊列)進行負載管理。
在使用資源群組進行資源管理時,可以為資源群組綁定一個或多個資料庫帳號,並針對每個資源群組單獨設定其特定的CPU、記憶體和並發限制等,來管理各個資源群組綁定帳號提交的查詢,但SET、RESET和SHOW命令不受資源群組配置限制。
6.0資源群組
AnalyticDB PostgreSQL 6.0版資源群組支援配置的資源類別如下:
參數 | 描述 | 取值 |
CONCURRENCY | 資源群組內允許的最大並發事務數(並行啟動並執行查詢數)。 | 預設值:50,非必填, 取值範圍:1~max_connections。該參數具體內容,請參見績效參數調優。 |
CPU_RATE_LIMIT | 用於定義在多個資源群組競爭CPU資源時的CPU分配比例。 | 無預設值,必填, 取值範圍:0~100, 各個資源群組的取值之和不超過100。 |
MEMORY_LIMIT | 資源群組記憶體佔總記憶體的百分比。具體內容,請參見6.0資源群組記憶體管理。 | 預設值:0,非必填, 取值範圍:0~100, 各個資源群組的取值之和不超過100。 |
MEMORY_SHARED_QUOTA | 定義了資源群組內部共用記憶體占所有記憶體的比例。具體內容,請參見6.0資源群組記憶體管理。 | 預設值:80,非必填, 取值範圍:0~100。 |
MEMORY_SPILL_RATIO | 記憶體敏感事務的記憶體使用量閾值(運算元落盤閾值)。 | 預設值:0,非必填 取值範圍:0~100。 |
6.0資源群組記憶體管理
資料庫按照各個資源群組設定的memory_limit在各個資源群組之間預留記憶體資源,如果各個資源群組的memory_limit總和小於100,資料庫會將剩餘未預留的記憶體配置給資源群組全域共用記憶體池。資料庫以先到先得的方式為事務分配資源群組全域共用記憶體。
每個資源群組預留的記憶體池內部,資源群組按照MEMORY_SHARED_QUOTA設定每個資源群組內用於固定預留部分和共用部分的記憶體比例。如果MEMORY_SHARED_QUOTA參數設定為100%,那麼資源群組內部的所有記憶體都將被視為共用記憶體,所有任務都可以使用這塊記憶體;如果MEMORY_SHARED_QUOTA參數值小於100%,系統將根據設定的比例將記憶體劃分為固定部分和共用部分,固定部分是每個任務獨佔的記憶體,而共用部分是所有任務共用的記憶體空間。AnalyticDB PostgreSQL 6.0版資源群組記憶體管理機制詳解如下圖所示:

AnalyticDB for PostgreSQL資源群組進行記憶體管理時,將資料庫機器的記憶體池劃分成組內固定、組內共用和全域共用。在執行查詢時會首先使用組內固定部分的記憶體,在組內固定部分的記憶體不夠時,會申請組內共用部分的記憶體值。在組內共用部分也耗盡時,會申請全域共用部分的記憶體值,當全域共用部分的記憶體也不足時,則會報OOM的錯誤終止查詢。具體內容如下圖所示:

當資料庫查詢同時滿足以下條件時,對應查詢將由於記憶體不足導致失敗:
沒有可用的組內共用記憶體。
沒有可用的全域共用記憶體。
該事務請求額外的記憶體。

在實際使用中,一般盡量讓組內固定部分的記憶體覆蓋大部分查詢所需要的記憶體,這樣在流量高峰到來時可以支援儘可能多的查詢並存執行。在業務查詢突發需要申請大記憶體時,也會有足夠的查詢共用部分記憶體以供業務正常執行。
6.0資源群組並發管理
當進入系統的查詢達到所屬資源群組的並發數上限後,該資源群組新進入的查詢需要進行等待。並發限制排隊時遵循先進先出的原則。
當提交的查詢由於達到並發限制而進行等待時,查看pg_stat_activity視圖時對應查詢處於waiting狀態,並且waiting_reason為group。
6.0資源群組CPU管理
AnalyticDB for PostgreSQL資源群組支援管理各個組的CPU分配比例,是一種允許搶佔的CPU管理方式,資料庫按照各個group設定的CPU_RATE_LIMIT值的比例進行CPU時間片分配。如果某資源群組設定了較高的CPU_RATE_LIMIT值,那麼在競爭CPU時,該資源群組將獲得較多的CPU時間片,從而更多的執行任務,反之則限制其對CPU資源的使用。同時,資源管理功能支援CPU搶佔,如果一個資源群組在執行任務而其餘資源群組沒有任務時,那麼這個資源群組就會佔有全部CPU資源。
在兩個資源群組都很繁忙時,使用CPU_RATE_LIMIT為40建立的資源群組將分配兩倍於使用CPU_RATE_LIMIT 為20建立的資源群組的CPU資源。
在CPU_RATE_LIMIT為40的資源群組無查詢進入時,CPU_RATE_LIMIT為20的資源群組可以使用接近全部的CPU資源。
6.0落盤管理
AnalyticDB for PostgreSQL源組支援對查詢的落盤閾值進行管理。在AnalyticDB for PostgreSQL中記憶體密集型運算元執行過程可能會產生大量中間臨時結果,會需要臨時溢出到磁碟,通過調整MEMORY_SPILL_RATIO來增加或減少溢出。因此只有需要產生大量中間臨時結果的操作類型受此控制。仍有很多操作是無法溢出到磁碟上的,這些操作會繼續佔用記憶體,即使記憶體使用量超過上限值,記憶體仍有可能增加。
當MEMORY_SPILL_RATIO大於0時,運算元落盤閾值由MEMORY_SPILL_RATIO決定。當敏感事務記憶體達到此閾值,將被溢出到磁碟。
當MEMORY_SPILL_RATIO等於0時,運算元落盤閾值由statement_mem決定。statement_mem的詳細資料,請參見績效參數調優。
當叢集負載大、記憶體資源緊張時,調小所在資源群組的memory_spill_ratio,讓記憶體密集型運算元如hashagg、join、sort等在運算過程中更多地進行落盤運算,以減少記憶體使用量。當叢集負載小、記憶體資源充足時,調大所在資源群組的memory_spill_ratio,讓落盤閾值提高,更多地在記憶體中進行計算,以提高查詢的執行效率。
7.0資源群組
AnalyticDB PostgreSQL 7.0版資源群組支援配置的資源類別如下:
參數 | 描述 | 取值 |
CONCURRENCY | 資源群組內允許的最大並發事務數(並行啟動並執行查詢數)。當進入系統的查詢達到所屬資源群組的並發數上限後,該資源群組新進入的查詢需要進行等待,等待隊列無長度限制。並發限制排隊時遵循先進先出的原則。 | 預設值:50,非必填, 取值範圍:1~max_connections。該參數具體內容,請參見績效參數調優。 |
CPU_MAX_PERCENT | 資源群組的CPU使用率上限值。 | 無預設值,必填, 取值範圍:0~100, 沒有各個資源群組的取值之和不超過100的限制。 |
CPU_WEIGHT | 資源群組的CPU分配權重。 | 預設值50,非必填, 取值範圍:0~500。 |
MEMORY_LIMIT | 資源群組使用的記憶體總和目標值。 取值為int,單位MB。 | 預設值-1,非必填,代表單個查詢使用的記憶體上限為statement_mem,配置非-1的值之後,單個query能夠使用的記憶體是max(memory_limit/concurrency, statement_mem)。 取值範圍:大於0,小於gp_vmem_protect_limit參數。 statement_mem和gp_vmem_protect_limit參數具體內容,請參見績效參數調優。 |
MIN_COST | 資料庫最佳化器受控於該資源群組的最低成本閾值,最佳化器成本低於該參數將不受該資源群組控制,使用全域資源。 | 預設值為0,代表該資源群組內的操作在資源分派優先順序上不受最低成本限制的影響,非必填, 取值範圍:0~2147483647。 |
7.0 資源群組並發管理
當進入系統的查詢達到所屬資源群組的並發數上限後,新進入該資源群組的查詢需要進行等待。並發限制排隊時遵循先進先出的原則。
當提交的查詢由於達到並發限制而進行等待時,查看pg_stat_activity視圖時wait_event_type為ResourceGroup。
當所在group有大量查詢處於並發等待時,需要合理提高資源群組並發能力,否則所在group的查詢效能可能受到影響。
7.0資源群組記憶體管理
AnalyticDB PostgreSQL 7.0版資源群組結合MEMORY_LIMIT配置,以及statement_mem、gp_resgroup_memory_query_fixed_mem參數來管理資源群組的記憶體使用量。
當gp_resgroup_memory_query_fixed_mem被配置為大於0的值後,單個查詢能夠使用的最大記憶體被限定為該值。
當gp_resgroup_memory_query_fixed_mem被配置為0(預設值)時,資源群組結合statement_mem和MEMORY_LIMIT確定單個查詢能夠使用的記憶體值。具體如下:
當所在資源群組的MEMORY_LIMIT設定為-1時,資源群組管理的單個查詢能夠使用的記憶體上限被限定為statement_mem。
當所在資源群組的MEMORY_LIMIT設定大於-1的值時,資源群組管理的單個查詢能夠使用的記憶體上限被限定為max(memory_limit/concurrency, statement_mem),即MEMORY_LIMIT除以並發值的結果,與statement_mem中的最大值。例如,在資料庫中有一個叫做etl的資源群組,它的MEMORY_LIMIT設定成了2.0 GB,並發值設為5。所以預設情況下,單個查詢預計能夠使用的記憶體值為400 MB。考慮如下情境:
使用者etl1提交了查詢Q1,並且session層級配置了gp_resgroup_memory_query_fixed_mem為800 MB(set gp_resgroup_memory_query_fixed_mem='800MB'),statement_mem設定為900MB,Q1最高能夠佔用800MB的記憶體。
使用者etl2提交了查詢Q2,沒有配置session層級配置gp_resgroup_memory_query_fixed_mem參數,statement_mem設定為300 MB,小於400 MB,所以Q2提交到系統,並佔用了400 MB的記憶體。
使用者etl3提交了查詢Q3,沒有配置session層級配置gp_resgroup_memory_query_fixed_mem參數,statement_mem設定為700 MB,大於400 MB,所以Q3提交到系統,並佔用了700 MB的記憶體。
7.0資源群組CPU管理
AnalyticDB PostgreSQL 7.0版資源群組基於CPU_MAX_PERCENT管理每個資源群組能夠使用的CPU使用率最大值,基於CPU_WEIGHT管理資源群組在各個資源群組之間的分配比例。會按照各個資源群組的CPU_WEIGHT比例去分配CPU時間片,同時保證各個資源群組的CPU使用率不超過設定的CPU_MAX_PERCENT值。
例如,資料庫中存在rg1和rg2兩個group,rg1的CPU_MAX_PERCENT設定為30,CPU_WEIGHT設定為100;rg2的CPU_MAX_PERCENT設定為60,CPU_WEIGHT設定為50。
只有rg1中存在活躍查詢,rg2中不存在活躍查詢。此時rg1的CPU使用率會達到30%,rg2的CPU使用率會達到60%。
rg1和rg2中同時存在活躍查詢。此時資料庫會將CPU時間片按照100:50的優先順序分配,直至某個資源群組的CPU使用率達到了對應的CPU_MAX_PERCENT的限制值。例如,rg1的CPU使用率達到了30%,在此之後即使兩者的WEIGHT依然是100:50的關係,也會優先向rg2分配,以確保rg1的CPU使用率不超過30%。
開啟資源群組管理
通過控制台開啟或關閉資源群組管理
核心版本為v6.6.1.0及以上的AnalyticDB PostgreSQL 6.0版執行個體,可以通過控制台開啟或關閉資源群組管理。切換資源管理員模式由資源隊列變為資源群組,切換過程中會重啟執行個體,並存在大約5分鐘執行個體不可用,請合理規劃時間,避免您的業務受到影響。具體操作,請參見如下步驟:
- 登入雲原生資料倉儲AnalyticDB PostgreSQL版控制台。
- 在控制台左上方,選擇執行個體所在地區。
- 找到目標執行個體,單擊執行個體ID。
在左側導覽列,單擊工作負載管理。
單擊開啟資源群組管理,並在彈窗中單擊確定。
通過提交工單開啟或關閉資源群組管理
核心版本為v6.6.1.0以下的AnalyticDB PostgreSQL 6.0版執行個體和AnalyticDB PostgreSQL 7.0版執行個體,需要提交工單開啟或關閉資源群組管理。
AnalyticDB PostgreSQL 7.0版執行個體暫時無法通過控制台使用資源群組,僅支援通過SQL語句使用資源群組。
開啟資源群組管理功能後,系統會自動建立一個default_group資源群組。在頁面的資源群組監控頁簽可以查看所有資源群組監控資訊,以及各個Segment的CPU和記憶體使用量等。
新增資源群組
開啟資源群組管理後,您可以通過控制台或後台執行SQL的方式新增資源群組。
AnalyticDB PostgreSQL 6.0版內部預留了
admin_group資源群組用於管理資料庫本身的系統負載。AnalyticDB PostgreSQL 6.0版執行個體中所有資源群組的CPU總和與Memory總和均為100,
admin_group資源群組預留的CPU和Memory為10,因此其他資源群組(新增資源群組和default_group資源群組)的CPU值總和與Memory值總和不能超過90。AnalyticDB PostgreSQL 7.0版資料庫存在預設的三個資源群組,
admin_group和system_group用於管控資料庫本身的系統負載,default_group用於其他使用者預設使用。
控制台操作
在工作負載管理頁面,單擊新增資源群組。
按照版本限制章節中的參數限制填寫參數,並單擊儲存新增。
SQL操作
CREATE RESOURCE GROUP <group_name> WITH (group_attribute=value [, ... ])對於AnalyticDB PostgreSQL 6.0版group_attribute包含:
CPU_RATE_LIMIT=integer
MEMORY_LIMIT=integer
[ CONCURRENCY=integer ]
[ MEMORY_SHARED_QUOTA=integer ]
[ MEMORY_SPILL_RATIO=integer ]對於AnalyticDB PostgreSQL 7.0版group_attribute包含:
CPU_MAX_PERCENT=integer
[CPU_WEIGHT=integer ]
[ CONCURRENCY=integer ]
[ MEMORY_LIMIT=integer ]
[ MIN_COST=integer ]查看資源群組配置
新增資源群組後,您可以通過控制台或後台執行SQL的方式查看資源群組配置。
控制台操作
在工作負載管理頁面的資源群組配置地區,查看執行個體中所有資源群組配置。
SQL操作
使用如下SQL查看資源群組配置:
SELECT * FROM gp_toolkit.gp_resgroup_config;修改資源群組配置
您可以通過控制台或後台執行SQL的方式修改資源群組配置。
控制台操作
在工作負載管理頁面,單擊資源群組列表上方的編輯。
根據業務需求,修改資源群組的並發數、CPU使用或記憶體百分比等,並單擊儲存。
SQL操作
對於AnalyticDB PostgreSQL 6.0版,僅資料庫初始帳號支援修改除admin_group資源群組外其他所有資源群組配置,普通帳號無法操作。
ALTER RESOURCE GROUP <group_name>
SET CONCURRENCY|CPU_RATE_LIMIT|MEMORY_LIMIT|MEMORY_SHARED_QUOTA|MEMORY_SPILL_RATIO <value>;樣本如下:
修改
test資源群組的並發數為30。ALTER RESOURCE GROUP test SET CONCURRENCY 20;修改
test_pg1資源群組的CPU使用率為20。ALTER RESOURCE GROUP test_pg1 SET CPU_RATE_LIMIT 20;
對於AnalyticDB PostgreSQL 7.0版,僅資料庫初始帳號支援修改除admin_group和system_group資源群組外其他所有資源群組配置,普通帳號無法操作。
ALTER RESOURCE GROUP <group_name>
SET CPU_MAX_PERCENT|CPU_WEIGHT|CONCURRENCY|MEMORY_LIMIT|MIN_COST <value>;樣本如下:
修改
test資源群組的並發數為30。ALTER RESOURCE GROUP test SET CONCURRENCY 20;修改
test_pg1資源群組的CPU使用率上限為20。ALTER RESOURCE GROUP test_pg1 SET CPU_MAX_PERCENT 20;
綁定資料庫帳號
您可以通過控制台或後台執行SQL的方式為資源群組綁定資料庫帳號。如何建立資料庫帳號,請參見建立資料庫帳號。
每個資源群組可以綁定一個或多個資料庫帳號,但每個帳號只能綁定一個資源群組。
資料初始帳號預設綁定
default_group資源群組。沒有綁定資源群組的資料庫帳號,會預設綁定
default_group資源群組。
控制台操作
在工作負載管理頁面的分配資源群組地區,單擊目標資源群組卡片上的
按鈕。選擇需要角色(資料庫帳號),並單擊確定。
SQL操作
僅資料庫初始帳號支援綁定資源群組,普通帳號無法操作。將資料庫帳號綁定到指定資源群組,文法如下:
為已有資料庫帳號綁定資源群組。
ALTER ROLE <user_name> RESOURCE GROUP <group_name>;建立資料庫帳號時綁定資源群組。
CREATE ROLE <user_name> WITH LOGIN RESOURCE GROUP <group_name>;
刪除資源群組
您可以通過控制台或後台執行SQL的方式刪除資源群組。
控制台操作
在工作負載管理頁面,單擊目標資源群組操作列的刪除,並單擊確定。
SQL操作
僅資料庫初始帳號支援刪除資源群組,資料庫普通帳號無法操作。
版本 | 參數 | 是否能被刪除 |
AnalyticDB PostgreSQL 6.0版 |
| 否 |
| 否 | |
AnalyticDB PostgreSQL 7.0版 |
| 否 |
| 否 | |
| 否 |
DROP RESOURCE GROUP <group_name>;手動查詢資源群組監控資訊
6.0版本
SELECT * FROM gp_toolkit.gp_resgroup_status;以下是各個監控項的描述:
欄位 | 描述 |
rsgname | 資源群組名稱。 |
groupid | 資源群組ID。 |
num_running | 當前處於運行中的查詢數。 |
num_queueing | 當前處於排隊中的查詢數。 |
num_queued | 該資源群組中的歷史排隊總查詢數。 |
num_executed | 該資源群組中的歷史總執行查詢數。 |
total_queue_duration | 該資源群組的總體累積排隊時間。(單位:s) |
cpu_usage | 資源群組在各個segment的CPU使用率。 |
memory_used | 資源群組實際使用的記憶體總量(單位:MB)。 |
memory_available | 資源群組可用的記憶體總量(單位:MB)。 |
memory_quota_used | 資源群組固定份額部分實際使用的記憶體總量(單位:MB)。 |
memory_quota_available | 資源群組固定份額部分可用的記憶體總量(單位:MB)。 |
memory_quota_granted | 資源群組固定份額部分的總體分配量。 |
memory_shared_used | 資源群組共用部分實際使用的記憶體總量(單位:MB)。 |
memory_shared_available | 資源群組共用部分可用的記憶體總量(單位:MB)。 |
memory_shared_granted | 資源群組共用部分的總體分配量。 |
7.0版本
查詢排隊時間和排隊數
SELECT * FROM gp_toolkit.gp_resgroup_status;以下是各個監控項的描述:
欄位 | 描述 |
groupid | 資源群組ID。 |
groupname | 資源群組名稱。 |
num_running | 資源群組當前運行事務數。 |
num_queueing | 資源群組當前排隊事務數。 |
num_queued | 資源群組歷史排隊事務總數。 |
num_executed | 資源群組歷史運行事務總數。 |
total_queue_duration | 資源群組累積排隊時間(單位:s)。 |
查詢CPU使用率和記憶體使用量率
SELECT * FROM gp_toolkit.gp_resgroup_status_per_host;以下是各個監控項的描述:
欄位 | 描述 |
groupid | 資源群組ID。 |
groupname | 資源群組名稱。 |
hostname | 機器名稱。 |
cpu_usage | CPU使用率,百分比。 |
memory_usage | 該segment上該資源群組目前使用的記憶體總量(單位:MB)。 |
關閉資源群組管理
如果您需要將資源管理員模式切換為資源隊列,您可以通過控制台關閉資源群組管理。關閉過程中會重啟執行個體,並存在大約5分鐘執行個體不可用,請合理規劃時間,避免您的業務受到影響。具體操作如下:
在控制台左上方,選擇執行個體所在的地區。
找到目標執行個體,單擊執行個體ID。
在左側導覽列,單擊工作負載管理,單擊關閉資源群組管理。