資料庫資源負載管理(下篇)
設定控制組
背景資訊
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核心數 |
- openGauss資料庫原始碼解析系列文章—— 密態等值查詢技術詳解(上)
- openGauss核心分析之查詢重寫
- 聊一聊資料庫的行存與列存
- 從核心程式碼瞭解SQL如何解析
- openGauss資料庫ODBC環境連線配置(Windows)
- openGauss簡單查詢SQL的執行流程解析
- openGauss資料庫JDBC環境連線配置(Eclipse)
- 資料庫密態等值查詢概述及操作
- 碼農必備SQL調優(下)
- openGauss 多執行緒架構啟動過程詳解
- 碼農必備SQL調優(上)
- openGauss企業版安裝
- 一文教會你資料庫系統調優
- openGauss資料庫效能調優概述及例項分析
- 使用gsql連線資料庫
- openGauss資料庫最先進的生產級特性-MOT
- 資料庫資源負載管理(下篇)
- 資料庫資源負載管理(上篇)
- AI4DB:人工智慧之慢SQL根因分析
- AI4DB:openGauss人工智慧引數調優之X-Tuner