資料庫資源負載管理(下篇)

語言: CN / TW / HK

設定控制組

背景資訊

openGauss資源負載管理的核心是資源池,而配置資源池首先要在環境中實現控制組Cgroups的設定。更多Cgroups的原理介紹,請檢視相關作業系統的產品手冊。

Class控制組為資料庫業務執行所在的頂層控制組,叢集部署時會自動生成預設子Class控制組“DefaultClass”。DefaultClass的Medium控制組會含有系統觸發的作業在執行,該控制組不允許進行資源修改,且執行在該控制組上的作業不受資源管理的控制,所以推薦建立新的子Class及其Workload控制組來設定資源比例。

前提條件

已熟悉《工具參考》中“服務端工具 > gs_cgroup”章節和“服務端工具 > gs_ssh”章節的使用。

操作步驟

說明:

  • 在openGauss中,需要在每個叢集節點上執行控制組的建立、更新、刪除操作,才能實現對整個叢集資源的控制,所以下述步驟中都使用《工具參考》中“服務端工具 > gs_ssh”命令執行。
  • 控制組的命名要求如下:
    • 無論是子Class控制組還是Workload控制組,都不允許在名稱中包含字元“:”。
    • 不可以建立同名的控制組。

建立子Class控制組和Workload控制組

1、以作業系統使用者omm登入openGauss主節點。
2、建立名稱為“class_a”和“class_b”的子Class控制組,CPU資源配額分別為Class的40%和20%。

gs_ssh -c "gs_cgroup -c -S class_a -s 40"

gs_ssh -c "gs_cgroup -c -S class_b -s 20"

3、建立子Class控制組“class_a”下名稱為“workload_a1”和“workload_a2”的Workload控制組,CPU資源配額分別為“class_a”控制組的20%和60%。

gs_ssh -c "gs_cgroup -c -S class_a -G workload_a1 -g 20 "

gs_ssh -c "gs_cgroup -c -S class_a -G workload_a2 -g 60 "

4、建立子Class控制組“class_b”下名稱為“workload_b1”和“workload_b2”的Workload控制組,CPU資源配額分別為“class_b”控制組的50%和40%。

gs_ssh -c "gs_cgroup -c -S class_b -G workload_b1 -g 50 "

gs_ssh -c "gs_cgroup -c -S class_b -G workload_b2 -g 40 "

更新控制組的資源配額

1、更新“class_a”控制組的CPU資源配額為30%。

gs_ssh -c "gs_cgroup -u -S class_a -s 30"

2、更新“class_a”下的“workload_a1”的CPU資源配額為“class_a”的30%。

gs_ssh -c "gs_cgroup -u -S class_a -G workload_a1 -g 30"

須知: 調整後的Workload控制組“workload_a1”佔有的CPU資源不應大於其對應的子Class控制組“class_a”。並且,此名稱不能是Timeshare Cgroup的預設名稱,如“Low”、“Medium”、“High”或“Rush”。

刪除控制組

gs_ssh -c "gs_cgroup -d  -S class_a"

以上操作可以刪除控制組“class_a”。

須知: root使用者或者具有root訪問許可權的使用者指定“-d” 和“-U username”刪除普通使用者“username”可訪問的預設Cgroups。普通使用者指定“-d”和“-S classname”可以刪除已有的Class Cgroups。

檢視控制組的資訊

1、檢視配置檔案中控制組資訊。

gs_cgroup -p 

控制組配置資訊

gs_cgroup -p
    
Top Group information is listed:
GID:   0 Type: Top    Percent(%): 1000( 50) Name: Root                  Cores: 0-47
GID:   1 Type: Top    Percent(%):  833( 83) Name: Gaussdb:omm           Cores: 0-20
GID:   2 Type: Top    Percent(%):  333( 40) Name: Backend               Cores: 0-20
GID:   3 Type: Top    Percent(%):  499( 60) Name: Class                 Cores: 0-20
    
Backend Group information is listed:
GID:   4 Type: BAKWD  Name: DefaultBackend   TopGID:   2 Percent(%): 266(80) Cores: 0-20
GID:   5 Type: BAKWD  Name: Vacuum           TopGID:   2 Percent(%):  66(20) Cores: 0-20
    
Class Group information is listed:
GID:  20 Type: CLASS  Name: DefaultClass     TopGID:   3 Percent(%): 166(20) MaxLevel: 1 RemPCT: 100 Cores: 0-20
GID:  21 Type: CLASS  Name: class1           TopGID:   3 Percent(%): 332(40) MaxLevel: 2 RemPCT:  70 Cores: 0-20
    
Workload Group information is listed:
GID:  86 Type: DEFWD  Name: grp1:2           ClsGID:  21 Percent(%):  99(30) WDLevel:  2 Quota(%): 30 Cores: 0-5
    
Timeshare Group information is listed:
GID: 724 Type: TSWD   Name: Low              Rate: 1
GID: 725 Type: TSWD   Name: Medium           Rate: 2
GID: 726 Type: TSWD   Name: High             Rate: 4
GID: 727 Type: TSWD   Name: Rush             Rate: 8
    
Group Exception information is listed:
GID:  20 Type: EXCEPTION Class: DefaultClass
PENALTY: QualificationTime=1800 CPUSkewPercent=30
    
GID:  21 Type: EXCEPTION Class: class1
PENALTY: AllCpuTime=100 QualificationTime=2400 CPUSkewPercent=90
    
GID:  86 Type: EXCEPTION Group: class1:grp1:2
ABORT: BlockTime=1200 ElapsedTime=2400

上述示例檢視到的控制組配置資訊如表1所示。

表 1 控制組配置資訊
在這裡插入圖片描述
2、檢視作業系統中樹形結構的控制組資訊。
執行如下命令可以查詢控制組樹形結構資訊。

gs_cgroup -P

返回資訊如下,其中shares代表作業系統中CPU資源的動態資源配額“cpu.shares”的數值,cpus代表作業系統中CPUSET資源的動態資源限額“cpuset.cpus”的數值,指的是該控制組能夠使用的核數範圍。

Mount Information:
cpu:/dev/cgroup/cpu
blkio:/dev/cgroup/blkio
cpuset:/dev/cgroup/cpuset
cpuacct:/dev/cgroup/cpuacct
    
Group Tree Information:
- Gaussdb:wangrui (shares: 5120, cpus: 0-20, weight: 1000)
        - Backend (shares: 4096, cpus: 0-20, weight: 400)
                - Vacuum (shares: 2048, cpus: 0-20, weight: 200)
                - DefaultBackend (shares: 8192, cpus: 0-20, weight: 800)
        - Class (shares: 6144, cpus: 0-20, weight: 600)
                - class1 (shares: 4096, cpus: 0-20, weight: 400)
                        - RemainWD:1 (shares: 1000, cpus: 0-20, weight: 100)
                                - RemainWD:2 (shares: 7000, cpus: 0-20, weight: 700)
                                        - Timeshare (shares: 1024, cpus: 0-20, weight: 500)
                                                - Rush (shares: 8192, cpus: 0-20, weight: 800)
                                                - High (shares: 4096, cpus: 0-20, weight: 400)
                                                - Medium (shares: 2048, cpus: 0-20, weight: 200)
                                                - Low (shares: 1024, cpus: 0-20, weight: 100)
                                - grp1:2 (shares: 3000, cpus: 0-5, weight: 300)
                        - TopWD:1 (shares: 9000, cpus: 0-20, weight: 900)
                - DefaultClass (shares: 2048, cpus: 0-20, weight: 200)
                        - RemainWD:1 (shares: 1000, cpus: 0-20, weight: 100)
                                - Timeshare (shares: 1024, cpus: 0-20, weight: 500)
                                        - Rush (shares: 8192, cpus: 0-20, weight: 800)
                                        - High (shares: 4096, cpus: 0-20, weight: 400)
                                        - Medium (shares: 2048, cpus: 0-20, weight: 200)
                                        - Low (shares: 1024, cpus: 0-20, weight: 100)
                        - TopWD:1 (shares: 9000, cpus: 0-20, weight: 900)

3、通過系統檢視獲取控制組配置資訊。
a.使用gsql連線資料庫。

b.獲取系統中所有控制組的配置資訊。

openGauss=# SELECT * FROM gs_all_control_group_info;

建立資源池

背景資訊

openGauss支援通過建立資源池對主機資源進行劃分。開啟資源負載管理之後,僅使用預設資源池並不能滿足業務對資源負載管理的訴求,必須根據需要建立新的資源池,對系統資源進行重分配,來滿足實際業務對系統資源精細管理的需要。普通資源池的特點見表1。

表 1 普通資源池的特點

資源池分類 特點
普通資源池(普通場景) 1、關聯Workload控制組。且必須沒有組資源池關聯該控制組對應的子class。即如果建立業務資源池關聯控制組‘class1:wd’,那麼必須沒有組資源池關聯‘class1’。2、mem_percent預設為0%,沒有mem_percent相加小於100%的限制。

在開啟了資源負載管理功能之後,系統會自動建立default_pool,當一個會話或者使用者沒有指定關聯的資源池時,都會被預設關聯到default_pool。default_pool預設繫結DefaultClass:Medium控制組,並且不限制所關聯的業務的併發數。default_pool的詳細屬性如表2所示。

表 2 default_pool屬性

屬性 屬性值 說明
respool_name default_pool 資源池名稱。
mem_percent 100 最大佔用記憶體百分比。
cpu_affinity -1 CPU親和性,保留引數。
control_group DefaultClass:Medium 資源池關聯的控制組。
active_statements -1 資源池允許的最大併發數。-1為不限制併發數量。
max_dop 1 開啟SMP後,運算元執行的併發度,保留引數。
memory_limit 8GB 記憶體使用上限,保留引數。
parentid 0 父資源池OID。
io_limits 0 每秒觸發IO的次數上限。行存單位是萬次/s,列存是次/s。0表示不控制。
io_priority None IO利用率高達90%時,重消耗IO作業進行IO資源管控時關聯的優先順序等級。None表示不控制。
nodegroup installation 資源池所在的邏輯叢集的名稱。
is_foreign f 資源池不用於邏輯叢集之外的使用者。

須知: openGauss不允許對default_pool引數進行修改。

前提條件

已熟悉CREATE RESOURCE POOL、ALTER RESOURCE POOL和DROP RESOURCE POOL語法的使用。

操作過程

建立資源池

1、使用gsql連線資料庫。
2、建立組資源池關聯到指定的子Class控制組。例如下面:名稱為“resource_pool_a”的組資源池關聯到了“class_a”控制組。

openGauss=# CREATE RESOURCE POOL resource_pool_a WITH (control_group='class_a');
openGauss=# CREATE RESOURCE POOL resource_pool_b WITH (control_group='class_b');
CREATE RESOURCE POOL

3、建立業務資源池關聯到指定的Workload控制組。例如下面:名稱為“resource_pool_a1”的業務資源池關聯到了“workload_a1”控制組。

openGauss=# CREATE RESOURCE POOL resource_pool_a1 WITH (control_group='class_a:workload_a1');
openGauss=# CREATE RESOURCE POOL resource_pool_a2 WITH (control_group='class_a:workload_a2');
openGauss=# CREATE RESOURCE POOL resource_pool_b1 WITH (control_group='class_b:workload_b1');
openGauss=# CREATE RESOURCE POOL resource_pool_b2 WITH (control_group='class_b:workload_b2');
CREATE RESOURCE POOL

說明:

  • 如果在建立資源池的時候不指定所關聯的控制組,則該資源池會被關聯到預設控制組(DefaultClass控制組下的“Medium” Timeshare控制組)。
  • control_group取值區分大小寫,指定時要使用單引號。
  • 若資料庫使用者指定Timeshare控制組代表的字串,即“Rush”、“High”、“Medium”或“Low”其中一種,如control_group的字串為“High”,代表資源池指定到DefaultClass控制組下的“High” Timeshare控制組。
  • control_group可以指定使用者建立Workload控制組,即’class1:wd’,也可以帶有控制組的級別,例如:‘class1:wd:2’,這個級別範圍一定要在1-10的範圍內,但這個級別將不做任何區分作用。在舊版本中,允許建立同名Workload控制組,以級別進行區分。但新版本升級後,不允許建立同名控制組,使用者如在舊版本中已建立同名Workload控制組,使用過程中其級別將不進行區分,由此可能造成的控制組不明確使用的問題,需要使用者自行把舊的同名控制組刪除以明確控制組使用。

管理資源池

修改資源池的屬性。例如下面:修改資源池“resource_pool_a2”關聯的控制組為“class_a:workload_a1”(假設class_a:workload_a1未被其他資源池關聯)。

openGauss=# ALTER RESOURCE POOL resource_pool_a2 WITH (control_group="class_a:workload_a1");
ALTER RESOURCE POOL

刪除資源池

刪除資源池。例如下面刪除資源池“resource_pool_a2”。

openGauss=# DROP RESOURCE POOL resource_pool_a2;
DROP RESOURCE POOL

說明:

  • 如果某個角色已關聯到該資源池,無法刪除。
  • 多租戶場景下,如果刪除組資源池,其業務資源池都將被刪除。只有不關聯使用者時,資源池才能被刪除。

檢視資源池的資訊

須知:
1、不允許使用INSERT、UPDATE、DELETE、TRUNCATE操作資源負載管理的系統表pg_resource_pool。
2、不允許修改資源池的memory_limit和cpu_affinity屬性。

  • 檢視當前叢集中所有的資源池資訊。
openGauss=# SELECT * FROM PG_RESOURCE_POOL;

   respool_name   | mem_percent | cpu_affinity |    control_group    | active_statements | max_dop | memory_limit | parentid | io_limits | io_priority |  nodegroup   | is_foreign  | max_worker
------------------+-------------+--------------+---------------------+-------------------+---------+--------------+----------+-----------+--------------+--------------+------------
 default_pool     |         100 |           -1 | DefaultClass:Medium |                -1 |       1 | 8GB          |        0 |         0 | None        | installation | f  |
 resource_pool_a  |          20 |           -1 | class_a             |                10 |       1 | 8GB          |        0 |         0 | None        | installation | f  |
 resource_pool_b  |          20 |           -1 | class_b             |                10 |       1 | 8GB          |        0 |         0 | None        | installation | f  |
 resource_pool_a1 |          20 |           -1 | class_a:workload_a1 |                10 |       1 | 8GB          |    16970 |         0 | None        | installation | f  |
 resource_pool_a2 |          20 |           -1 | class_a:workload_a2 |                10 |       1 | 8GB          |    16970 |         0 | None        | installation | f  |
 resource_pool_b1 |          20 |           -1 | class_b:workload_b1 |                10 |       1 | 8GB          |    16971 |         0 | None        | installation | f  |
 resource_pool_b2 |          20 |           -1 | class_b:workload_b2 |                10 |       1 | 8GB          |    16971 |         0 | None        | installation | f  |
(7 rows)

  • 檢視某個資源池關聯的控制組資訊,具體內容可以參考統計資訊函式章節的gs_control_group_info(pool text)函式。

如下命令中“resource_pool_a1”為資源池名稱。

openGauss=# SELECT * FROM gs_control_group_info('resource_pool_a1');

        name         |  class  |  workload   | type  | gid | shares | limits | rate | cpucores
---------------------+---------+-------------+-------+-----+--------+--------+------+----------
 class_a:workload_a1 | class_a | workload_a1 | DEFWD |  87 |     30 |      0 |    0 | 0-3
(1 row)

表 3 gs_control_group_info屬性

屬性 屬性值 說明
name class_a:workload_a1 class和workload名稱
class class_a Class控制組名稱
workload workload_a1 Workload控制組名稱
type DEFWD 控制組型別(Top、CLASS、BAKWD、DEFWD、TSWD)
gid 87 控制組id
shares 30 佔父節點CPU資源的百分比
limits 0 佔父節點CPU核數的百分比
rate 0 Timeshare中的分配比例
cpucores 0-3 CPU核心數