设置控制组
背景信息
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核心数 | 
