环境:centos7.9;GBase 8a V9.5.3.27
GBase南大通用的GBase 8a MPP Cluster 资源管理功能可以对 SELECT 和 DML 等受控 SQL 在运 行过程中使用的 CPU、内存、I/O 和磁盘空间等资源进行合理管控,以达到资 源合理利用,系统稳定性运行的要求 。
GBase 8a MPP Cluster 资源管理由 Consumer Group(资源消费组)、Resource Pool (资源池)、Resource Plan(资源计划)、Resource Directive(资源指令)、User (资源消费用户)组成 。
资源消费组用于关联数据库用户,一个用户只能属于一个资源消费组,一个资源消费组可以有多个用户。存在默认消费组(default_consumer_group )的概念,所有未被分配指定消费组的用户都属于默认消费组。
资源池分为静态资源池和动态资源池,负责对资源进行划分。
资源计划则是一组或多组资源池与资源消费组对应关系的集合。
资源池、资源消费组、资源计划通过资源指令结合起来。
GBase 8a资源管理功能依赖于操作系统的cgroup组件,需要执行
yum install libcgroup*
安装所需依赖,然后对cgroup的配置文件进行修改。
vi /etc/cgconfig.conf
在配置文件中追加以下内容(若集群安装时,运行SetSysEnv.py指定了-cgroup参数,则无需手动配置该文件):
mount {
? ? cpu = /cgroup/cpu;
? ? cpuacct = /cgroup/cpuacct;
? ? blkio = /cgroup/blkio;
}
group gbase {
? ? ? ? ? ? perm{
? ? ? ? ? ? ? ? task{
? ? ? ? ? ? ? ? ? ? uid = gbase;
? ? ? ? ? ? ? ? ? ? gid = gbase;
? ? ? ? ? ? ? ? }
? ? ? ? ? ?? ? admin{
? ? ? ? ? ? ? ? ? ? uid = gbase;
? ? ? ? ? ? ? ? ? ? gid = gbase;
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ?}
? ? ? ? cpu{
? ? ? ? }
? ? ? ? cpuacct{
? ? ? ? }
? ? ? ? blkio{
? ? ? ? }
}
之后创建文件夹并进行挂载
mkdir /cgroup
mkdir /cgroup/cpu /cgroup/cpuacct /cgroup/blkio
mount -t cgroup -o cpu cpu /cgroup/cpu
mount -t cgroup -o cpuacct cpuacct /cgroup/cpuacct
mount -t cgroup -o blkio blkio /cgroup/blkio
生效配置
cgclear
cgconfigparser -l /etc/cgconfig.conf
连接数据库,使用如下SQL语句创建基本对象。
#三个group对应三个user
create user user1;
create user user2;
create user user3;
create consumer group group1;
create consumer group group2;
create consumer group group3;
ALTER CONSUMER GROUP group1 ADD USER user1;
ALTER CONSUMER GROUP group2 ADD USER user2;
ALTER CONSUMER GROUP group3 ADD USER user3;
#创建三个plan
create resource plan plan1;
create resource plan plan2;
create resource plan plan3;
#创建三个静态资源池
create resource pool static_pool1(cpu_percent=80,max_memory=1000,max_temp_diskspace=2000,max_disk_space=2000,max_disk_writeio=1000,max_disk_readio=1000) type static;
create resource pool static_pool2(cpu_percent=80,max_memory=1000,max_temp_diskspace=2000,max_disk_space=2000,max_disk_writeio=1000,max_disk_readio=1000) type static;
create resource pool static_pool3(cpu_percent=80,max_memory=1000,max_temp_diskspace=2000,max_disk_space=2000,max_disk_writeio=1000,max_disk_readio=1000) type static;
#为pool1创建动态资源池1,cpu超过了静态资源池,其他均为原来的一半
create resource pool dynamic_pool1_1(priority=1,cpu_percent=100,max_memory=500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500,max_activetask=2,task_max_parallel_degree=100,task_waiting_timeout=100000,task_running_timeout=100000)TYPE dynamic BASE ON static_pool1;
#虽然cpu超过了静态池,但是没有报错(因为动态池的cpu设置为权重设置)
#之后将1_1挂载到plan1上
CREATE RESOURCE DIRECTIVE dir1 ( PLAN_NAME = 'plan1', GROUP_NAME ='group1', POOL_NAME = 'dynamic_pool1_1');
#再创建一个1_2,没有报错,虽然其和1_1的cpu加起来已经110了,但是没有挂载,就无所谓,接下来将其和默认group挂载到plan1上试一下
create resource pool dynamic_pool1_2(priority=1,cpu_percent=10,max_memory=500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500,max_activetask=2,task_max_parallel_degree=100,task_waiting_timeout=100000,task_running_timeout=100000)TYPE dynamic BASE ON static_pool1;
#执行下列语句,报错了,因为1_1和1_2的CPU总权重超过了100%,
CREATE RESOURCE DIRECTIVE dir2 ( PLAN_NAME = 'plan1', GROUP_NAME ='default_consumer_group', POOL_NAME = 'dynamic_pool1_2');
#此时总结规律如下,动态资源池的cpu值,在创建时只要不超过100即可,但是挂载时,总和不能大于100,那要是两个动态资源池属于两个静态资源池呢?
#此时,pool1为80,再创建一个pool4为2,并为其创建一个pool4_1为100,看看挂载到plan1上会不会报错。
create resource pool static_pool4(cpu_percent=2,max_memory=1000,max_temp_diskspace=2000,max_disk_space=2000,max_disk_writeio=1000,max_disk_readio=1000) type static;
create resource pool dynamic_pool4_1(priority=1,cpu_percent=100,max_memory=500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500,max_activetask=2,task_max_parallel_degree=100,task_waiting_timeout=100000,task_running_timeout=100000)TYPE dynamic BASE ON static_pool4;
CREATE RESOURCE DIRECTIVE dir2 ( PLAN_NAME = 'plan1', GROUP_NAME ='default_consumer_group', POOL_NAME = 'dynamic_pool4_1');
#没有报错,即挂载的动态资源池的占比*对应静态资源池,不超过100即可。
#cpu的逻辑已经理清了,此时在测试一下内存和磁盘的逻辑:可以看到此时pool4的内存为1000,pool4_1的内存为500,那么再创建一个pool4_2的内存为600,会不会报错呢,应该不会,因为此时并没有触发挂载。
create resource pool dynamic_pool4_2(priority=1,cpu_percent=100,max_memory=600,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500,max_activetask=2,task_max_parallel_degree=100,task_waiting_timeout=100000,task_running_timeout=100000)TYPE dynamic BASE ON static_pool4;
#没有报错,要是创建一个pool4_3内存为1500呢?
create resource pool dynamic_pool4_3(priority=1,cpu_percent=100,max_memory=1500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500,max_activetask=2,task_max_parallel_degree=100,task_waiting_timeout=100000,task_running_timeout=100000)TYPE dynamic BASE ON static_pool4;
#报错了,因为其值已经超过了静态池的该值。
#此时再尝试将内存为600的pool4_2挂载到plan1上,应该会报错,因为内存总和大于了1000
CREATE RESOURCE DIRECTIVE dir3 ( PLAN_NAME = 'plan1', GROUP_NAME ='group2', POOL_NAME = 'dynamic_pool4_2');
#报错了,符合预期
#按照验证内存的逻辑,再简单验证一下磁盘是不是同理。经验证,同理。即,另外五个必选参数,在创建时,不能超过原静态池,在挂载时,总和不能超过原静态池的值。
#此外还测试到如下逻辑:
#激活一个计划时,当前所有的用户必须被全部分配
#存在激活计划时,创建删除资源指令均不可以。
create resource pool dynamic_pool4_5(priority=1,cpu_percent=100,max_memory=500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500)TYPE dynamic BASE ON static_pool4;
CREATE RESOURCE DIRECTIVE dir5 ( PLAN_NAME = 'plan2', GROUP_NAME ='group3', POOL_NAME = 'dynamic_pool4_3');
DROP RESOURCE DIRECTIVE dir5;
create resource pool dynamic_pool4_7(priority=1,cpu_percent=80,max_memory=500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500,max_activetask=9999999999989999999999)TYPE dynamic BASE ON static_pool4;
ALTER resource pool dynamic_pool4_3 SET(priority=1,cpu_percent=100,max_memory=500,max_temp_diskspace=1000,max_disk_space=1000,max_disk_writeio=500,max_disk_readio=500)TYPE dynamic BASE ON static_pool4;
#非必选参数经测试,确实可以任意设置
创建资源管理相关对象
如上图,先创建一个最大内存为1M的静态资源池,再在其基础上创建一个同样最大内存为1M的动态资源池
CREATE RESOURCE DIRECTIVE dir1 ( PLAN_NAME = 'plan1', GROUP_NAME='default_consumer_group', POOL_NAME = 'dpool1');
之后将这个动态资源池与默认资源组挂载到plan1
激活资源计划
创建测试用表并插入数据
创建测试表t1和t2,插入部分数据
进行测试
执行一个复杂SQL
可以看到报错如下:
ERROR 1708 (HY000): [192.168.161.128:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01EX-700) Gbase general error: Exceed max Large Buffer Usage
SQL: SELECT /*192.168.161.128_34_36_2023-02-10_10:52:54*/ /*+ TID('242') */ `vcname000001.test.t1`.`a` AS `a`, `_tmp_2158078144_34_t1_1_1675996745_s`.`c1` AS `c1` FROM `gctmpdb`._tmp_2158078144_34_t1_1_1675996745_s INNER JOIN `test`.`t1_n1` `vcname000001.test.t1` ON (`vcname000001.test.t1`.`a` = `_tmp_2158078144_34_t1_1_1675996745_s`.`c1`)
关闭计划
再次执行对应SQL
再次执行同样SQL,没有报错,可见资源管理功能内存管理有效。