本文介绍GBase 8a数据库集群里,对资源管理的功能介绍。通过对系统CPU,内存,磁盘等资源的使用控制,在多用户下实现资源调度和平衡。
目录导航
参考
查看当前资源管理使用情况,请参考 GBase 8a资源通过管理元数据查看当前配置
单纯基于用户的,不想启用资源管控功能,请参考 GBase 8a实现用户磁盘空间配额限制
资源管控的对象
GBase 8a MPP Cluster 资源管理功能可以对 SELECT 和 DML 等受控 SQL 在运行过程中使用的 CPU、内存、I/O 和磁盘空间等资源进行合理管控,以达到资源合理利用,系统稳定性运行的要求。其中:
- CPU:实现对受控 SQL 使用 CPU 优先级和百分比控制,以及 SQL 并发数及并行度的管理。
- 内存:实现对受控 SQL 使用的算子 buffer 内存使用上限的控制。
- I/O:实现对受控 SQL 使用的 direct I/O 磁盘读写速率上限的控制(通量控制,不包括iops)。
- 磁盘空间:实现对表数据文件占用磁盘空间大小的管控(不包括索引)。
资源管控架构
消费者组:用户是通过消费者组来成批管理。
资源池:通过资源池配置,包含了静态和动态资源池。
资源计划:将不同的资源方案整合到一起,可以包含多个资源指令(消费者组和资源池的对照关系)。同一时刻只能由1个资源计划激活,。
资源指令:通过组合消费者组和资源池,形成对这个组用户的资源管理,并加入某个资源计划里。
资源管理使用流程
按照前面的介绍,逐步创建需要的内容。一个简单的样例,可以参考
环境要求
集群所有节点必须安装 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
- 优先级,共分 8 级,1 为最高,8 为最低,视为保留参数,建议统一配置为 1;
- 此优先级只针对 CPU 设置。
cpu_percent
- 使用 CPU 资源的百分比,以整数表示,范围为[1,100];
- 对于静态资源池为 CPU 百分比带宽控制( 可参考 linux cgroup/cpu 中 cpu.cfs_quota_us 参数说明,计算公式为 cpu.cfs_quota_us = (cpu_cores *cpu.cfs_period_us) * cpu_percent );
- 对于动态池为 CPU 使用权重控制 (可参考linux/cgroup 中 cpu.shares 参数说明, 计算公式为 cpu.shares = 1024 * cpu_percent)。
max_memory
- 最大使用内存量,设置单位为 M,动态池总值应小于或等于其所在静态池设定;
- 若不控制内存,建议设置值大于(物理内存+SWAP)的和值。
max_disk_space
- 该资源池关联的所有用户的表空间占用磁盘总和,设置单位为 M;
- 若不控制磁盘空间,建议设置值大于物理磁盘空间大小;
- 该参数为必填参数,设置的动态池参数总和不能超过静态池参数。
max_temp_diskspace
- 池中单个任务执行过程中可使用临时磁盘量,设置单位为 M;
- 若不控制占用临时磁盘大小,建议设置值大于物理磁盘空间大小;
- 该参数为必填参数,设置得动态池参数总和不能超过静态池参数。
max_disk_writeio
- 池中任务对所有磁盘访问的写速率限制,设置单位为 MB/S,此参数必须与 DC 同步 I/O 控制参数_gbase_dc_sync_size 配合使用才生效;
- gbase_dc_sync_size 须小于等于所有动态池中设置的max_disk_writeio 值,建议_gbase_dc_sync_size=1M (DC 同步 I/O 控制详细介绍请参看本小节的说明部分);
- 若不控制此项,建议设值置大于物理磁盘写性能理论值;
- 设置动态池总值应小于或等于其所在静态池设定。
max_disk_readio
- 池中任务对所有磁盘访问的读速率限制,设置单位为 MB/S;
- 若不控制此项,建议设置值大于物理磁盘读性能理论值;
- 动态池总值应小于或等于其所在静态池设定。
max_activetask
- 此参数为动态资源池专属,表明同时池中可并发任务数,缺省值为 20,可根据内存设置该参数,每个任务的内存使用量限制 = max_memory /max_activetask;
- 该参数如果过大会使得每个任务内存使用量下降,导致任务执行失败;
- 如果下发任务数大于此参数值,则多出的任务进入等待队列。
task_max_parallel_degree
- 池中任务执行并发度,缺省为 16;
- 注:one pass group、并行 hash group、并行 update、并行 order by,在并行物化阶段会占用 2 倍的并行度。应分配 2 倍以上的并行度来避免发生串行。
此并行度并不影响加载的并行度设置。
task_waiting_timeout
- 池中任务等待执行超时时间,设置单位为秒,其经验值为 task_waiting_timeout = 最大容忍等待队列长度 * (task_running_timeout * 调整系数);
- 由于 task_running_timeout 一般会高于池中任务实际执行时长,所以可做适当调整,缺省为2592000s。
task_running_timeout
- 池中任务执行超时时间,设置单位为秒,可参考集群中对于池中任务平均执行统计值进行调整,缺省为 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>;