版本:latest

资源管理准备

资源规划

完成资源负载管理功能配置前,需要先根据业务模型完成租户资源的规划。业务运行一段时间后,可以根据资源的使用情况再进行配置调整。

本章节我们假设某大型企业内的两个部门共用同一套集群,openGauss通过将同一个部门需要使用的系统资源集合划分为系统的一个租户,以此来实现不同部门间的资源隔离,其资源规划如表1所示。

表 1 租户资源规划

租户名称

参数名称

取值样例

租户A

子Class控制组

class_a

Workload控制组

  • workload_a1
  • workload_a2

组资源池

resource_pool_a

业务资源池

  • resource_pool_a1
  • resource_pool_a2

组用户

tenant_a

业务用户

  • tenant_a1
  • tenant_a2

租户B

子Class控制组

class_b

Workload控制组

  • workload_b1
  • workload_b2

组资源池

resource_pool_b

业务资源池

  • resource_pool_b1
  • resource_pool_b2

组用户

tenant_b

业务用户

  • tenant_b1
  • tenant_b2

启动资源负载管理功能

背景信息

使用资源负载管理功能前,需要参考本节完成参数配置。

前提条件

  • 在openGauss中,如果需要对系统资源进行管理,用户需要拥有DBA权限。通过执行如下语法查询哪些用户拥有该权限:

    openGauss=# SELECT rolname FROM pg_roles WHERE rolsystemadmin = 't';
     rolname
    ---------
     omm
     Jack
    (2 rows)
  • 如果想要将一个用户纳入资源负载管理的范围,则此用户必须具有login权限。通过执行如下语法查询哪些用户拥有该权限:

    openGauss=# SELECT rolname FROM pg_roles WHERE rolcanlogin = 't';
     rolname
    ---------
     omm
    (1 row)

须知

如果一个用户的login权限被取消,那么他的resource pool将会自动修改为default_pool。default_pool的详细介绍请参见表2

操作步骤

DBA权限用户可以通过如下步骤启动基于资源池的资源负载管理。此处以omm用户为例进行描述。

  1. 以操作系统用户omm登录openGauss主节点。

  2. 开启基于资源池的资源负载管理功能。

    gs_guc set -N all -I all -c "use_workload_manager=on"
  3. 重启数据库使参数设置生效。

    gs_om -t stop && gs_om -t start

设置控制组

背景信息

openGauss资源负载管理的核心是资源池,而配置资源池首先要在环境中实现控制组Cgroups的设置。更多Cgroups的原理介绍,请查看相关操作系统的产品手册。openGauss的控制组请参考查看控制组的信息

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”。

删除控制组

  1. 删除控制组“class_a”。

    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 控制组配置信息

    GID

    类型

    名称

    Percent(%)信息

    特定信息

    0

    Top控制组

    Root

    1000代表总的系统资源为1000份。

    括号中的50代表IO资源的50%。

    openGauss不通过控制组对IO资源做控制,因此下面其他控制组信息中仅涉及CPU配额情况。

    -

    1

    Gaussdb:omm

    系统中只运行一套数据库程序,Gaussdb:omm控制组默认配额为833,数据库程序和非数据库程序的比值为(833:167=5:1)。

    -

    2

    Backend

    Backend和Class括号中的40和60,代表Backend占用Gaussdb:dbuser控制组40%的资源,Class占用Gaussdb:dbuser控制组60%的资源。

    -

    3

    Class

    -

    4

    Backend控制组

    DefaultBackend

    括号中的80和20代表DefaultBackend和Vacuum占用Backend控制组80%和20%的资源。

    TopGID:代表Top类型控制组中Backend组的GID,即2。

    5

    Vacuum

    20

    Class控制组

    DefaultClass

    DefaultClass和class1的20和40代表占Class控制组20%和40%的资源。因为当前只有两个Class组,所有它们按照20:40的比例分配Class控制组499的系统配额,则分别为166和332。

    • TopGID:代表DefaultClass和class1所属的上层控制(Top控制组中的Class组)的GID,即3。
    • MaxLevel:Class组当前含有的Workload组的最大层次,DefaultClass没有Workload Cgroup,其数值为1。
    • RemPCT:代表Class组分配Workload组后剩余的资源百分比。如class1中剩余的百分比为70。

    21

    class1

    86

    Workload控制组

    grp1:2

    (该名称由Workload Cgroup Name和其在class中的层级组成,它是class1的第一个Workload组,层级为2,每个Class组最多10层Workload Cgroup。)

    根据设置,其占class1的百分比为30,则为332*30%=99。

    • ClsGID:代表Workload控制组所属的上层控制组(class1控制组)的GID。
    • WDLevel:代表当前Workload Cgroup在对应的Class组所在的层次。

    724

    Timeshare控制组

    Low

    -

    Rate:代表Timeshare中的分配比例,Low最少为1,Rush最高为8。这四个Timeshare组的资源配比为Rush:High:Medium:Low=8:4:2:1

    725

    Medium

    -

    726

    High

    -

    727

    Rush

    -

  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访问openGauss数据库。

    b.获取系统中所有控制组的配置信息。

    openGauss=# SELECT * FROM gs_all_control_group_info;

创建资源池

背景信息

openGauss支持通过创建资源池对主机资源进行划分。开启资源负载管理之后,仅使用默认资源池并不能满足业务对资源负载管理的诉求,必须根据需要创建新的资源池,对系统资源进行重分配,来满足实际业务对系统资源精细管理的需要。普通资源池的特点见表1

表 1 普通资源池的特点

资源池分类

特点

普通资源池(普通场景)

  • 关联Workload控制组。且必须没有组资源池关联该控制组对应的子class。即如果创建业务资源池关联控制组‘class1:wd’,那么必须没有组资源池关联‘class1’。
  • 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为不限制并发数量,最大值不超过INT_MAX。

max_dop

1

开启SMP后,算子执行的并发度,保留参数。

memory_limit

8GB

内存使用上限,保留参数。

parentid

0

父资源池OID。

io_limits

0

每秒触发IO的次数上限。行存单位是万次/s,列存是次/s。0表示不控制,最大值不超过INT_MAX。

io_priority

None

IO利用率高达90%时,重消耗IO作业进行IO资源管控时关联的优先级等级。None表示不控制。

nodegroup

InstallationGuide

资源池所在的逻辑集群的名称(单机下不生效)。

is_foreign

f

资源池不用于逻辑集群之外的用户(单机下不生效)。

须知

openGauss不允许对default_pool参数进行修改。

前提条件

已熟悉CREATE RESOURCE POOLALTER RESOURCE POOLDROP RESOURCE POOL语法的使用。

操作过程

创建资源池

  1. 使使用gsql访问openGauss数据库。

  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

说明

  • 如果某个角色已关联到该资源池,无法删除。
  • 多租户场景下,如果删除组资源池,其业务资源池都将被删除。只有不关联用户时,资源池才能被删除。

查看资源池的信息

须知

  • 不允许使用INSERT、UPDATE、DELETE、TRUNCATE操作资源负载管理的系统表pg_resource_pool。
  • 不允许修改资源池的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        | InstallationGuide | f  |
     resource_pool_a  |          20 |           -1 | class_a             |                10 |       1 | 8GB          |        0 |         0 | None        | InstallationGuide | f  |
     resource_pool_b  |          20 |           -1 | class_b             |                10 |       1 | 8GB          |        0 |         0 | None        | InstallationGuide | f  |
     resource_pool_a1 |          20 |           -1 | class_a:workload_a1 |                10 |       1 | 8GB          |    16970 |         0 | None        | InstallationGuide | f  |
     resource_pool_a2 |          20 |           -1 | class_a:workload_a2 |                10 |       1 | 8GB          |    16970 |         0 | None        | InstallationGuide | f  |
     resource_pool_b1 |          20 |           -1 | class_b:workload_b1 |                10 |       1 | 8GB          |    16971 |         0 | None        | InstallationGuide | f  |
     resource_pool_b2 |          20 |           -1 | class_b:workload_b2 |                10 |       1 | 8GB          |    16971 |         0 | None        | InstallationGuide | 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核心数