GBase 8a资源管控资源管理的介绍

GBase 8a 数据库集群资源管控架构图

本文介绍GBase 8a数据库集群里,对资源管理的功能介绍。通过对系统CPU,内存,磁盘等资源的使用控制,在多用户下实现资源调度和平衡。

参考

查看当前资源管理使用情况,请参考 GBase 8a资源通过管理元数据查看当前配置

单纯基于用户的,不想启用资源管控功能,请参考 GBase 8a实现用户磁盘空间配额限制

资源管控的对象

GBase 8a MPP Cluster 资源管理功能可以对 SELECT 和 DML 等受控 SQL 在运行过程中使用的 CPU、内存、I/O 和磁盘空间等资源进行合理管控,以达到资源合理利用,系统稳定性运行的要求。其中:

  1. CPU:实现对受控 SQL 使用 CPU 优先级和百分比控制,以及 SQL 并发数及并行度的管理。
  2. 内存:实现对受控 SQL 使用的算子 buffer 内存使用上限的控制。
  3. I/O:实现对受控 SQL 使用的 direct I/O 磁盘读写速率上限的控制(通量控制,不包括iops)。
  4. 磁盘空间:实现对表数据文件占用磁盘空间大小的管控(不包括索引)。

资源管控架构

消费者组:用户是通过消费者组来成批管理。

资源池:通过资源池配置,包含了静态和动态资源池。

资源计划:将不同的资源方案整合到一起,可以包含多个资源指令(消费者组和资源池的对照关系)。同一时刻只能由1个资源计划激活,。

资源指令:通过组合消费者组和资源池,形成对这个组用户的资源管理,并加入某个资源计划里。

GBase 8a 数据库集群资源管控架构图
GBase 8a 数据库集群资源管控架构

资源管理使用流程

按照前面的介绍,逐步创建需要的内容。一个简单的样例,可以参考

GBase 8a通过资源管控限制集群SQL并行数量

GBase 8a数据库集群资源管理使用流程图
GBase 8a数据库集群资源管理使用流程

环境要求

集群所有节点必须安装 libcgroup 和 libcgroup-devel rpm 包。同时操作系统版本要求redhat 7.3+或suse 11 sp3+。

系统cgconfig服务必须是正常运行状态。

创建和管理 Consumer Group

不同 VC 中的 group_name 允许重名。
集群安装完成后,存在一个默认资源消费组 default_consumer_group,该消费组的 id=1。
任何计划内 default_consumer_group 必须关联动态资源池。

创建

CREATE CONSUMER GROUP [vc_name.]<group_name> [COMMENT = 'comment'];

更改名称

ALTER CONSUMER GROUP [vc_name.]<group_name> RENAME [TO] <new_name>;

更改描述

ALTER CONSUMER GROUP [vc_name.]<group_name> COMMENT = 'comment';

删除

DROP CONSUMER GROUP [vc_name.]<group_name>;

用户所属消费者组配置

同一 vc 下,consumer group 与 user 之间是一对多的关系,即一个 consumer group 中可以包含多个 user,一个 user 只能隶属于一个 consumer group。

增加成员

ALTER CONSUMER GROUP [vc_name.]<group_name> ADD USER <user_name>;

删除成员

ALTER CONSUMER GROUP [vc_name.]<group_name> REMOVE USER <user_name>;

管理 Resource Pool

资源池为集群任务执行过程中的资源供给者与管理者,分为静态资源池与动态资源池两种,静态资源池为资源供给者,而动态资源池为资源管理者,约束任务对资源的使用。

创建

其中,base on 在创建动态资源池时使用,parent_pool_name 为 动态资源池隶属的静态资源池名称。

CREATE RESOURCE POOL [vc_name.]<resource_pool_name> (pool_attribute=value [, ...]) 
TYPE {static|dynamic} [BASE ON <parent_pool_name>]

更改

更改名称

ALTER RESOURCE POOL [vc_name.]<resource_pool_name> RENAME [TO]
 <new_resource_pool_name>;

更改参数

ALTER RESOURCE POOL [vc_name.]<resource_pool_name> SET (pool_attribute=value [, ...]);

删除

DROP RESOURCE POOL [vc_name.]<resource_pool_name>;

删除静态资源池,必须先删除其挂接的动态资源池。
若一个动态资源池在 directive 中被引用,则无法删除该动态资源池。需要删除 directive 解除动态资源池的关联关系后,动态资源池才可以被删除。

属性列表

DC(Data Cell)同步 I/O 控制通过参数_gbase_dc_sync_size(单位:字节)控制,当列数据文件在 Buffer 中未刷出的 DC 大小超过指定值时,执行同步写 I/O 操作。此参数默认值为 1TB,此时 I/O 操作将由系统周期回写机制完成。此参数最小值为 0,表示每次受控 SQL 都调用同步 I/O 操作。
一个静态资源池中可以包含多个动态资源池。
一个动态资源池只能且必须隶属于一个静态资源池。
动态池与其隶属的静态池必须在同一个 VC 内。

priority

  1. 优先级,共分 8 级,1 为最高,8 为最低,视为保留参数,建议统一配置为 1;
  2. 此优先级只针对 CPU 设置。

cpu_percent

  1. 使用 CPU 资源的百分比,以整数表示,范围为[1,100];
  2. 对于静态资源池为 CPU 百分比带宽控制( 可参考 linux cgroup/cpu 中 cpu.cfs_quota_us 参数说明,计算公式为 cpu.cfs_quota_us = (cpu_cores *cpu.cfs_period_us) * cpu_percent );
  3. 对于动态池为 CPU 使用权重控制 (可参考linux/cgroup 中 cpu.shares 参数说明, 计算公式为 cpu.shares = 1024 * cpu_percent)。

max_memory

  1. 最大使用内存量,设置单位为 M,动态池总值应小于或等于其所在静态池设定;
  2. 若不控制内存,建议设置值大于(物理内存+SWAP)的和值。

max_disk_space

  1. 该资源池关联的所有用户的表空间占用磁盘总和,设置单位为 M;
  2. 若不控制磁盘空间,建议设置值大于物理磁盘空间大小;
  3. 该参数为必填参数,设置的动态池参数总和不能超过静态池参数。

max_temp_diskspace

  1. 池中单个任务执行过程中可使用临时磁盘量,设置单位为 M;
  2. 若不控制占用临时磁盘大小,建议设置值大于物理磁盘空间大小;
  3. 该参数为必填参数,设置得动态池参数总和不能超过静态池参数。

max_disk_writeio

  1. 池中任务对所有磁盘访问的写速率限制,设置单位为 MB/S,此参数必须与 DC 同步 I/O 控制参数_gbase_dc_sync_size 配合使用才生效;
  2. gbase_dc_sync_size 须小于等于所有动态池中设置的max_disk_writeio 值,建议_gbase_dc_sync_size=1M (DC 同步 I/O 控制详细介绍请参看本小节的说明部分);
  3. 若不控制此项,建议设值置大于物理磁盘写性能理论值;
  4. 设置动态池总值应小于或等于其所在静态池设定。

max_disk_readio

  1. 池中任务对所有磁盘访问的读速率限制,设置单位为 MB/S;
  2. 若不控制此项,建议设置值大于物理磁盘读性能理论值;
  3. 动态池总值应小于或等于其所在静态池设定。

max_activetask

  1. 此参数为动态资源池专属,表明同时池中可并发任务数,缺省值为 20,可根据内存设置该参数,每个任务的内存使用量限制 = max_memory /max_activetask;
  2. 该参数如果过大会使得每个任务内存使用量下降,导致任务执行失败;
  3. 如果下发任务数大于此参数值,则多出的任务进入等待队列。

task_max_parallel_degree

  1. 池中任务执行并发度,缺省为 16;
  2. 注:one pass group、并行 hash group、并行 update、并行 order by,在并行物化阶段会占用 2 倍的并行度。应分配 2 倍以上的并行度来避免发生串行。
    此并行度并不影响加载的并行度设置。

task_waiting_timeout

  1. 池中任务等待执行超时时间,设置单位为秒,其经验值为 task_waiting_timeout = 最大容忍等待队列长度 * (task_running_timeout * 调整系数);
  2. 由于 task_running_timeout 一般会高于池中任务实际执行时长,所以可做适当调整,缺省为2592000s。

task_running_timeout

  1. 池中任务执行超时时间,设置单位为秒,可参考集群中对于池中任务平均执行统计值进行调整,缺省为 2592000s。

静态资源池必须参数

cpu_percent
max_memory
max_temp_diskspace
max_disk_space
max_disk_writeio
max_disk_readio
因其它参数针对静态资源池无效,建议不用出现在定义语句中。

动态资源池必须参数

cpu_percent
max_memory
max_temp_diskspace
max_disk_space
max_disk_writeio
max_disk_readio
动态资源池参数设定之和不能超过挂接的静态池对应参数,其他参数选填。

资源计划Resource Plan

Resource Plan(资源计划)为按照一定规律规划集群中资源使用的方案,在资源计划中将资源消费组挂接到合理的资源池中,以保证更有效地利用集群资源。

创建

在所属 VC 范围内,Resource Plan 名字是唯一的,不同 VC 中的 Resource Plan 允许重名。

CREATE RESOURCE PLAN [vc_name.]<plan_name> [COMMENT
='comment'];

更改名称

ALTER RESOURCE PLAN [vc_name.]<plan_name> RENAME [TO] <new_plan_name>;

更改描述

ALTER RESOURCE PLAN [vc_name.]<plan_name> COMMENT ='comment';

删除

DROP RESOURCE PLAN [vc_name.]<plan_name>;

资源指令Resource Directive

Resource Directive(资源指令)指定在资源计划中资源消费组与动态资源池的挂接关系。

创建

创建资源指令中涉及的 plan、pool、group 必须已经创建。
若当前 VC 存在激活的 plan,不允许执行创建 directive 操作。
同一资源计划内一个资源消费组只能挂接到一个动态资源池。
同一资源计划内一个动态资源池则可挂接多个资源消费组。
任何计划内 default consumer group 必须关联动态资源池,即创建对应的 directive。

CREATE RESOURCE DIRECTIVE [vc_name.]<directive_name> (
PLAN_NAME = 'plan_name',
GROUP_NAME = 'group_name',
POOL_NAME = 'resource_pool_name',
[COMMENT = 'comment']
);

vc_name 虚拟集群名字,可选参数,不输入的情况下取当前默认 VC
directive_name 资源指令名字
PLAN_NAME 资源计划名字。
GROUP_NAME 消费组名字。
POOL_NAME 资源池名字。
COMMENT 注释

删除

若当前 VC 存在激活的 resource plan,不允许执行删除 directive 操作。

DROP RESOURCE DIRECTIVE [vc_name.]<directive_name>;

激活资源管理

同一 VC 下,同一时段只能有一个 plan 被激活;
在任何 resource plan 中,default consumer group 必须与动态池关联,才可以激活该resource plan。

V8版本

set global active_resource_plan='<resource_plan_name>';

V9版本

ACTIVE RESOURCE PLAN <resource_plan_name> ON VC <vc_name>;

关闭资源管理

V8版本

set global active_resource_plan='';

V9版本

DEACTIVE RESOURCE PLAN ON VC <vc_name>;

参考